簡體   English   中英

Android本機守護程序通過JNI調用Java方法

[英]Android native daemon call to Java method via JNI

我有一個Android Java類:

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");
    }    
}

我也有一個帶有JNI_OnLoad的本地共享庫“ libtestcontrol”,還有一個我試圖用於調用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()");
        // }
        // (....)

    }
}

最后,我在init.rc上啟動了一個獨立的C守護程序,該守護程序共享“ libtestcontrol”庫,並在一段時間后從共享庫調用makeCallto_tryBack方法。

void periodicProccess(){

    makeCallto_tryBack();

  // (...)
}

然后發生的是,在makeCalltoTryCallback()方法中,“ vm_global”引用始終為NULL,而在JNI_Onload中正確初始化的值卻不為null。 換句話說,在JNI_OnLoad之后,沒有JavaVM vm_global變量的持久性。 我該如何解決?

您的PeriodicProcess()在單獨的進程中運行,這就是為什么它不與Java應用程序共享全局變量的原因。 您在這里需要一些IPC機制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM