Я новичок в JNI и Android NDK, я хочу вызвать API Java из одного из моих потоков языка c.При вызове метода Java я получаю сообщение об ошибке:
Может ли кто-нибудь подсказать мне, каков наилучший подход для вызова метода Java из потока AC?
Ниже приведен код,Недопустимая ошибка ссылки JNI
JavaVM *m_vm;
jobject obj;
JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
m_vm = vm;
return JNI_VERSION_1_4;
}
int aWorkerThread() {
JNIEnv *env;
jmethodID mid;
(*m_vm)->GetEnv(m_vm, (void**) &env, JNI_VERSION_1_4);
(*m_vm)->AttachCurrentThread(m_vm, &env, NULL);
jclass cls = (*env)->GetObjectClass(env, obj)
jmethodID mid = (*env)->GetMethodID(env, cls, "callbackfromNative", "(Ljava/lang/String;)V");
if (mid == NULL) {
return -1; // method not found
}
const char *pchar = "Hello From C layer";
jstring jStr = NULL;
jStr = (*env)->NewStringUTF(env, pchar);
(*env)->CallVoidMethod(env, obj, mid,jStr);
return 0;
}
Установка obj в глобальную переменную
void Java_com_my_demo_init(JNIEnv * env, jobject this, jstring logThis)
{
int nErrorCode;
jboolean isCopy;
const char * szLogThis = (*env)->GetStringUTFChars(env, logThis, &isCopy);
__android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "FromJava: [%s]", szLogThis);
obj = this; /*Lets assign obj here*/
/*Some other c code here..*/
(*env)->ReleaseStringUTFChars(env, logThis, szLogThis);
}
Сообщение об ошибке:
06-20 13:12:03.239: WARN/dalvikvm(753): JNI WARNING: 0x44e83338 is not a valid JNI reference
06-20 13:12:03.239: WARN/dalvikvm(753): in Ldalvik/system/NativeStart;.run ()V (GetObjectClass)
...
06-20 13:12:03.279: ERROR/dalvikvm(753): VM aborting