【发布时间】:2012-02-16 01:19:57
【问题描述】:
我被这个困住了,我需要从 c/c++ 调用一个 Java 函数。
在示例和教程中,我只看到一个调用 c 方法的 java 应用程序,并且在同一个方法中调用另一个 java 方法,但我想做的是从代码的任何部分调用 java 方法。这就是我所拥有的:
static JNIEnv mEnv;
static jclass mClassAndroidActivity;
static mMethodSayHello;
JNIEXPORT void JNICALL JNI_FUNCTION(AndroidActivity_nativeInit)(JNIEnv* env, jobject obj, int width, int height)
{
mEnv = env;
jclass cls = (*env)->GetObjectClass(env, obj);
mClassAndroidActivity = (*env)->NewGlobalRef(env, cls);
mMethodSayHello = (*env)->GetMethodID (env, mClassAndroidActivity, "SayHello", "(Ljava/lang/String;)V");
}
//this method is called from a cpp
void nativeSayHello(char* msg)
{
jstring string = (*mEnv)->NewStringUTF(mEnv, msg);
(*mEnv)->CallVoidMethod(mEnv, mClassAndroidActivity, mMethodSayHello, string);
}
但总是崩溃,我尝试不使用 NewGlobalRef,在 JNI_Function 中使用 mEnv 而不是 env,我尝试从 JNI_OnLoad 获取方法 ID,但总是崩溃。
这是我得到的日志:
02-15 18:09:48.520: W/dalvikvm(27904): JNI WARNING: threadid=1 using env from threadid=0
【问题讨论】:
-
'我得到的“最佳”日志说线程 1 的 env 与线程 0 不同'这是正确的,我相信。每个 Java 线程应该有一个不同的 env 指针。
-
是的,但是我怎样才能保存第一个 env 指针,以便我可以在不同的线程中使用
标签: java android c++ java-native-interface