2017-06-09 32 views
0

AndroidのJNIを使​​用してCコードからJava関数を呼び出そうとしていますが、私はやや面倒です。JNI関数(Android)の外でCのJavaの関数を呼び出しますか?

私のCコードは、ライブラリに渡されるコールバック内のJNI関数の外部で実行されています。ここで

は、Javaコードここ

package com.my.java.package; 

class MyClass { 
    public function handleData(byte[] data) { 
     doSomethingWithThisData(data); 
    } 
} 

の一例であるC Libはそれを行うために必要なものない時はいつでも今、それが引き金となるCコード

void handleData(uint8_t *data, size_t len) { 
    // I need to call handleData in my java 
    // class instance from here, but i have 
    // no access to a JNIEnv here. 

    // I don't think I can create one, since 
    // it has to be the same object that's 
    // sending JNI calls elsewhere. 
} 

. . . 

myCLibInstance.callback = handleData; 

の一例です折り返し電話。しかし、データを処理するためにjavaクラスに戻す方法はありません。

答えて

1

Android NDKの一部のバージョンでは、JNI_GetCreatedJavaVMsを使用して現在のVMを取得することができます。ただし、JNI_OnLoadをオーバーライドしてそこにVMを保存することをお勧めします。

extern jint JNI_GetCreatedJavaVMs(JavaVM **vm, jsize size, jsize *size2); 

static JavaVM *jvm = NULL; 


static jint JNI_OnLoad(JavaVM* vm, void* reserved) { 
    jvm = vm; 
    JNIEnv *env = NULL; 

    if (jvm && (*jvm)->GetEnv(jvm, (void**)&env, JNI_VERSION_1_6) == JNI_OK) 
    { 
     return JNI_VERSION_1_6; 
    } 
    return -1; 
} 

JavaVM* getJavaVM() { 
    if (jvm) 
    { 
     return jvm; 
    } 

    jint num_vms = 0; 
    const jint max_vms = 5; 
    JavaVM* vms[max_vms] = {0}; 
    if (JNI_GetCreatedJavaVMs(vms, max_vms, &num_vms) == JNI_OK) 
    { 
     for (int i = 0; i < num_vms; ++i) 
     { 
      if (vms[i] != NULL) 
      { 
       return vms[i]; 
      } 
     } 
    } 
    return NULL; 
} 

void handleData(uint8_t *data, size_t len) { 
    JavaVM *jvm = getJavaVM(); 

    if (jvm) 
    { 
     JNIEnv *env = NULL; 
     if ((*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL) == JNI_OK) 
     { 
      if (env) 
      { 
       //Call function with JNI.. 
      } 

      (*jvm)->DetachCurrentThread(jvm); 
     } 
    } 
} 
+0

あなたJNIOnLoad関数は戻り値の型を利用できないようです..あなたは、VMを持っていたら、あなたは現在のスレッドにアタッチし、関数を呼び出す取得することができ、いずれかの方法を使用して、それはちょうど、ボイドすべきですか?それとも静的である必要がありますか編集:静的なjint'のように見えます –

+0

私はこれを直ちに試しています。ありがとう –

+0

'handleData'は静的ではありません。どのようにして電話をするつもりですか? – manuell

関連する問題