当然。它实际上比您链接的示例更容易,因为您不必生成 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
如果你没有得到你想使用的类的对象,你可以使用FindClass 和NewObject 函数来创建一个,如下所示
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.