Вызов Java из C - PullRequest
       4

Вызов Java из C

2 голосов
/ 20 июня 2011

Я новичок в 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

1 Ответ

2 голосов
/ 20 июня 2011

Вы получили класс объекта (cls) и метод класса (mid), но на самом деле у вас нет экземпляра объекта. Это как иметь нулевой объект и пытаться вызвать один из его методов. Вам нужно установить obj, используя либо JNI-вызов AllocObject , либо NewObject , что подобно выполнению «нового» Java-оператора над объектом. AllocObject отличается от NewObject тем, что конструктор объекта не вызывается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...