java - 使用 jni 从 native 代码调用 Java 方法

标签 java c java-native-interface

我刚开始使用 JNI。我成功地编写了一些调用用 c 语言编写的 native 方法的程序。

现在我需要我的 java 代码在初始化后被 native 代码端调用。是否可以? 到目前为止,我尝试了某种轮询技术。也就是说,我会定期检查我的 Java 代码中的 native 代码参数,但如果 native 代码可以发送某种中断,则效率会更高。是否可以?或者您能提出比轮询更好的方法吗?

注意: 当我搜索“使用 JNI 从 C 调用 Java 函数”时,我得到的所有答案都是

http://www.codeproject.com/Articles/22881/How-to-Call-Java-Functions-from-C-Using-JNI

JNI Call java method from c program

这些例子不能回答我的情况。因为我的主程序是在java中,我想问的是:我从java代码调用的本地函数(用c编写)在某些情况下是否可以调用其他一些java函数?是否可以在不使用我上面提到的轮询技术的情况下进行管理?

最佳答案

当然。它实际上比您链接的示例更容易,因为您不必生成 JVM 来执行它——调用您的 java 函数为您提供指向您可以使用的环境的指针。作为一个简单的例子:使用这样的 Java 类:

public class foo {
  static {
    // load libfoo.so / foo.dll
    System.loadLibrary("foo");
  }

  private native void nativecall();

  public static void main(String[] args) {
    foo f = new foo();

    f.nativecall();
  }

  public void callback() {
    System.out.println("callback");
  }

  public static void callback_static() {
    System.out.println("static callback");
  }
}

还有一个像这样从 C 代码编译的库:

#include <jni.h>

JNIEXPORT void JNICALL Java_foo_nativecall(JNIEnv *env, jobject foo_obj) {
  // Get the class from the object we got passed in
  jclass cls_foo = (*env)->GetObjectClass(env, foo_obj);

  // get the method IDs from that class
  jmethodID mid_callback        = (*env)->GetMethodID      (env, cls_foo, "callback"       , "()V");
  jmethodID mid_callback_static = (*env)->GetStaticMethodID(env, cls_foo, "callback_static", "()V");

  // then call them.
  (*env)->CallVoidMethod      (env, foo_obj, mid_callback);
  (*env)->CallStaticVoidMethod(env, cls_foo, mid_callback_static);
}

你会得到输出

callback
static callback

如果你没有得到你想要使用的类的对象,你可以使用 FindClassNewObject 函数来创建一个,如下所示

jclass    cls_foo  = (*env)->FindClass  (env, "foo");
jmethodID ctor_foo = (*env)->GetMethodID(env, cls_foo, "<init>", "()V");
jobject   foo_obj  = (*env)->NewObject  (env, cls_foo, ctor_foo);

进一步阅读 here .

关于java - 使用 jni 从 native 代码调用 Java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28042285/

相关文章:

c - 什么算法将数字 27 映射到 BBC

java - Java 函数式接口(interface)的单例作为枚举

java - 使用 picocli 可扩展的应用程序。最佳实践问题

c - C中结构内的函数指针

c - 读取变量时出错,无法访问地址 X 的内存

c++ - 使用 Android NDK r11 时出现链接错误

java h2内存数据库错误: Table not found

java - 在 Java 中生成 MM7 Soap 请求

java - C + JNI : CallStaticCharMethod causes error

android - 哪种 JNI 数据类型?