在JNI函数(Android)之外从C调用java中的函数?

我正在尝试使用Android中的JNI从我的C代码调用Java函数,但我处于一种有点尴尬的境地。

我的C代码在传递给库的回调中的JNI函数之外执行。

这是java代码的一个例子

package com.my.java.package; class MyClass { public function handleData(byte[] data) { doSomethingWithThisData(data); } } 

这是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; 

现在每当C Lib执行它需要做的事情时,它将触发回调。 但我无法将其发送回java类来处理数据。

在某些版本的Android NDK上,可以使用JNI_GetCreatedJavaVMs来获取当前的VM ..但是,更好的选择是覆盖JNI_OnLoad并将VM保存在那里。 使用任一方法,一旦有了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); } } }