我对 JNI 非常陌生,在将 C++ iOS 代码移植到 JNI 之前,我试图弄清楚某些事情是如何工作的。我成功地让 NDK 示例之一在 Android studio 中运行,我可以看到 Java 如何调用 C++ 函数。
我一直在四处寻找并获取大量代码,但我无法让它在我的具体实现中工作。
只是为了测试事情是如何工作的,我在 java 中设置了一个简单的文本日志函数,我试图从我的本机代码中调用它,但我遇到了问题。
这是我的 Java 函数:
public static void log(String s){
Log.d("Native", s);
}
And C++:
void Log(std::string s){
JNIEnv *env;
g_JavaVM->GetEnv((void**)&env, JNI_VERSION_1_6);
jstring jstr1 = env->NewStringUTF(s.c_str());
jclass clazz = env->FindClass("com/android/gl2jni/GL2JNILib");
jmethodID mid = env->GetStaticMethodID(clazz, "log", "(Ljava/lang/String;)V");
jobject obj = env->CallStaticObjectMethod(clazz, mid, jstr1);
}
从我在不同示例中看到的情况来看,这应该可行,但会引发错误:
29835-29849/com.android.gl2jni A/libc﹕ Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 29849 (Thread-17371)
我错过了什么吗?
EDIT:
我已将其更改为 GetStaticMethodID。但在记录函数的进度后,我发现失败的行是:
g_JavaVM->GetEnv((void**)&env, JNI_VERSION_1_6);
我认为是因为 g_JavaVM 设置为static JavaVM* g_JavaVM = NULL;
然后就再也没有碰过。我猜我需要设置这个变量,但是如何设置呢?