JNI方法不回调Java方法

时间:2014-11-03 12:50:31

标签: android callback java-native-interface

解决:我需要在调用方法之前创建一个新对象!

我一直试图从JNI调用Java方法。调用工作正常,应用程序不会崩溃,但JAVA方法也不会被调用。

对我做错的任何想法?

我的JNI代码:

jclass test_method = findClass("com/package/Test");

if (test_method == NULL) {
    __android_log_print(ANDROID_LOG_ERROR, "JNI", "failed to find test");
} else {
    __android_log_print(ANDROID_LOG_ERROR, "JNI", "found test object");
}
jmethodID test_const =  env->GetMethodID(test_method, "<init>", "(I)V");

jobject employeeObject = (env)->NewObject(test_method, test_const, 800);

if (employeeObject == NULL) {
    __android_log_print(ANDROID_LOG_ERROR, "JNI", "failed to find object");
} else {
    __android_log_print(ANDROID_LOG_ERROR, "JNI", "found emp object");
}
jclass myclass = findClass("com/package/TestObj");

if(myclass == NULL) {
    __android_log_print(ANDROID_LOG_ERROR, "JNI", "Couldnt find myclass");
    return;
} else {
    __android_log_print(ANDROID_LOG_ERROR, "JNI", "Found myclass");
}

g_clazz = (jclass)env->NewGlobalRef(myclass);

if (g_clazz == NULL) {
    fLogPrintf(LOG_DEBUG,"Failed to find class");
}
new_method = env->GetMethodID(g_clazz, "setParams", "(Lcom/package/Test;)V");

if (new_method == 0) {
    __android_log_print(ANDROID_LOG_ERROR, "JNI", "failed to find method");
}

(*env).CallVoidMethod(g_clazz, new_method, employeeObject);
__android_log_print(ANDROID_LOG_ERROR, "JNI", "succesfully finished  calling method");
if (env->ExceptionCheck()) {
    env->ExceptionDescribe();
}

__android_log_print(ANDROID_LOG_ERROR, "JNI", "Detaching current thread");
m_jvm->DetachCurrentThread();

我的Java代码:

package com.package; 

class TestObj { 
    public void setParams(Test test) {
        Log.e("Oops", " Callback successfully called!");
    }
}

当我运行应用程序时,它运行完美,没有任何错误/崩溃,我也得到了#34;成功完成调用方法&#34;和&#34;分离当前线程&#34;表明JNI能够成功调用我的函数的日志,但是当我检查Java方法setParams的日志时,我看不到任何日志。

知道我错过了什么吗?

由于

1 个答案:

答案 0 :(得分:0)

我需要在调用方法之前创建一个新对象!所以我在调用方法之前添加了以下几行代码:

jmethodID constructor = env->GetMethodID(g_clazz, "<init>", "(I)V"); 
jobject test_object = env->NewObject(g_clazz, constructor, 48);

然后最终修改了对方法的最终调用:

(*env).CallVoidMethod(test_object, new_method, 23);

之前的电话错误:

(*env).CallVoidMethod(g_clazz, new_method, 23);

使用g_clazz是问题