当然。实际上比你链接的示例更容易,因为你不需要生成JVM来执行它--调用你的java函数会给你一个指向环境的指针,你可以使用它。作为一个简单的例子:有一个这样的Java类:
public class foo {
static {
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) {
jclass cls_foo = (*env)->GetObjectClass(env, foo_obj);
jmethodID mid_callback = (*env)->GetMethodID (env, cls_foo, "callback" , "()V");
jmethodID mid_callback_static = (*env)->GetStaticMethodID(env, cls_foo, "callback_static", "()V");
(*env)->CallVoidMethod (env, foo_obj, mid_callback);
(*env)->CallStaticVoidMethod(env, cls_foo, mid_callback_static);
}
你会得到输出
callback
static callback
如果您无法获取想要使用的类的对象,则可以使用FindClass
和NewObject
函数创建一个对象,例如:
如果您要使用的类的对象不存在,则可以使用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);
深入阅读 这里。