У меня есть Android Java Class:Android вызов родной демон метода Java с помощью JNI
package com.test.Testing;
public class MainActivity extends Activity {
static {
System.loadLibrary("testcontrol");
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
public void tryBack() {
Log.v("test", "callback called");
}
}
Я тоже родной разделяемая библиотека называется «libtestcontrol» с JNI_OnLoad и один метод, который я пытаюсь использовать для вызывает метод Java tryBack:
JavaVM * global_vm;
jint JNI_OnLoad(JavaVM* vm, void* reserved) {
JNIEnv jvm_env;
if ((*vm)->GetEnv(vm, (void **) &jvm_env, JNI_VERSION_1_6) != JNI_OK) {
alog_error ("JNI_ONLOAD Failed to get the environment using GetEnv()");
return -1;
}
// *** Supposed to cache vm_global. I've tried too vm_global=vm ****
(*jvm_env)->GetJavaVM(jvm_env, &vm_global);
if (vm_global == NULL) {
alog_error ("JNI_ONLOAD: vm_global is NULL");
}
else {
alog_error ("JNI_ONLOAD: vm_global is NOT NULL <- by here");
}
return JNI_VERSION_1_6;
}
void makeCallto_tryBack(){
if (vm_global == NULL)
alog_error ("MAKECALL: vm_global is NULL <- by here");
else {
alog_error ("MAKECALL: vm_global is NOT NULL");
if ((*vm_global)->AttachCurrentThreadAsDaemon(vm_global, &jvm_env, NULL) != 0) {
alog_error ("JNI Failed to attach thread as daemon");
//
// Rest of code for execute Java call to tryCallback
//
// if ((*vm_global)->GetEnv(vm_global, (void**) &jvm_env, JNI_VERSION_1_6) != JNI_OK) {
// alog_error ("Failed to get the environment using GetEnv()");
// }
// (....)
}
}
наконец, у меня есть автономные C демон inited в init.rc, который разделяет библиотеку «libtestcontrol» и через некоторое время вызывает к makeCallto_tryBack метод из общей библиотеки.
void periodicProccess(){
makeCallto_tryBack();
// (...)
}
Что происходит тогда, что "vm_global" ссылка всегда NULL в makeCalltoTryCallback() метод, Altough правильно inited не нуль в JNI_Onload. Другими словами, после JNI_OnLoad не сохраняется переменная JavaVM vm_global. Как я могу это решить?
Спасибо Алекс. Я так и думал, но был смущен спецификациями JNI. Я проведу метод обмена данными между процессами. – jlcarretero