Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android本机守护进程通过JNI调用Java方法_Java_Android_Callback_Java Native Interface - Fatal编程技术网

Android本机守护进程通过JNI调用Java方法

Android本机守护进程通过JNI调用Java方法,java,android,callback,java-native-interface,Java,Android,Callback,Java Native Interface,我有一个Android Java类: package com.test.Testing; public class MainActivity extends Activity { static { System.loadLibrary("testcontrol"); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(save

我有一个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");
    }    
}
我还有一个名为“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()");
        // }
        // (....)

    }
}

然后发生的情况是,“vm_global”引用在makeCalltoTryCallback()方法中始终为NULL,尽管在JNI_Onload中正确初始化,但不为NULL。换句话说,JNI_OnLoad之后,JavaVM vm_全局变量没有持久性。如何解决这个问题?

您的periodicProcess()在一个单独的进程中运行,这就是它不与Java应用程序共享全局变量的原因。这里需要一些机制。

periodicProcess()在单独的进程中运行,这就是为什么它不与Java应用程序共享全局变量的原因。你需要一些机械装置。

谢谢Alex。我是这么想的,但我对JNI规范感到困惑。我将检查一种在进程之间共享数据的方法。谢谢Alex。我是这么想的,但我对JNI规范感到困惑。我将检查一种在进程之间共享数据的方法。
void periodicProccess(){

    makeCallto_tryBack();

  // (...)
}