我遇到了一个问题,需要从c/c++中调用Java函数。
在示例和教程中,我只看到一个Java应用程序调用C方法,并在该方法中调用另一个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警告:threadid=1正在使用来自threadid=0的env