2013-08-07 3 views
1

У меня есть 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. Как я могу это решить?

ответ

1

Ваш процесс periodProcess() запускается в отдельном процессе, поэтому он не использует глобальные переменные с Java-приложением. Здесь вам нужен механизм IPC.

+0

Спасибо Алекс. Я так и думал, но был смущен спецификациями JNI. Я проведу метод обмена данными между процессами. – jlcarretero

Смежные вопросы