此页面很有帮助:http : //hildstrom.com/projects/jni/index.html
假设您有一个 Java 类:
package foo;
public class bar {
public static int timesTen(int input){
return input * 10;
}
}
Run Code Online (Sandbox Code Playgroud)
一旦你有一个 JVM 和 JNIEnv*(细节省略...),你可以从 C++ 调用 Java 方法,如下所示:
jclass myClass = env->FindClass("foo.bar");
jmethodID mid = env->GetStaticMethodID(myClass, "timesTen", "(I)I");
jint hundred = env->CallStaticIntMethod(myClass, mid, (jint)10);
Run Code Online (Sandbox Code Playgroud)
这掩盖了很多细节,包括异常处理,如果省略这些细节会导致 JVM 崩溃。有关所有血腥详细信息,请搜索“Java Native Interface”并点击 Oracle 链接。
既然有人问......这就是你如何获得Env*。请注意,如果 JVM 调用您的本机代码,则它已经有一个 Env*。
JNIEnv* env(0);
jint rv = vm->GetEnv((void**)&env, JNI_VERSION_1_6);
if (rv == JNI_OK) {
return env;
} else if (rv == JNI_EDETACHED) {
// This happens if you created the thread, not the JVM
rv = vm->AttachCurrentThread((void**)&env, 0);
if (rv != JNI_OK) {
// error
}
} else {
// error
}
Run Code Online (Sandbox Code Playgroud)
使用 JNI 从 C/C++ 调用 Java 非常繁琐且容易出错,这一点我再怎么强调也不为过。错误是隐秘的和低级的。您必须处理异常,并且必须分离线程,否则事情会变得丑陋。