ndk-build 'JNI_CreateJavaVM' tidak dideklarasikan dalam cakupan ini

Saya mengalami kesalahan saat mencoba memanggil metode Java dari kode asli.

[arm64-v8a] Compile++      : hell <= hell.cpp
/home/zns/AndroidStudioProjects/Test/app/src/main/jni/hell.cpp: In function 'int main()':
/home/zns/AndroidStudioProjects/Test/app/src/main/jni/hell.cpp:8:42: error: 'JNI_CreateJavaVM' was not declared in this scope
     JNI_CreateJavaVM(&jvm, &env, &vm_args);
                                          ^
make: *** [/home/zns/AndroidStudioProjects/Test/app/src/main/obj/local/arm64-v8a/objs/hell/hell.o] Error 1

neraka.cpp

#include <string.h>
#include <jni.h>
int main(){
    JavaVM *jvm;       /* denotes a Java VM */
    JNIEnv *env;       /* pointer to native method interface */
    JavaVMInitArgs vm_args; /* JDK/JRE 6 VM initialization arguments */
    vm_args.version = JNI_VERSION_1_6;
    JNI_CreateJavaVM(&jvm, &env, &vm_args);
    jclass cls = env->FindClass("MainActivity");
    jmethodID mid = env->GetStaticMethodID(cls, "test", "()V");
    env->CallStaticVoidMethod(cls, mid, 100);
    jvm->DestroyJavaVM();
}

extern "C" {
     jstring
      Java_com_oxide_app_MainActivity_stringFromJNI
      (JNIEnv *env, jobject obj)
      {
          main();
          return env->NewStringUTF("Hello from C++ over JNI!");
      }

}

Aktivitas Utama.java

public class MainActivity extends ActionBarActivity {
    static{
        System.loadLibrary("hell");
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

            TextView tv = new TextView(this);
            tv.setText(stringFromJNI());
            setContentView(tv);
}
    public  native String stringFromJNI();

    public void test(){
        Log.d("NATIVE", "WHOA");
    }    

}

sistem operasi: linux;

jdk:/opt/icedtea-bin-6.1.12.7/;

P.S. Saya telah melihat dua pertanyaan serupa, tetapi tidak membantu menyelesaikan masalah Memanggil metode JAVA dari C++ dengan JNI, tanpa parameter Menggunakan JNI untuk mengeksekusi java jar dari program C++, menggunakan g++ atau Eclipse


person Oxide Alluminum    schedule 30.04.2015    source sumber


Jawaban (1)


Dari jni.h NDK

#if 0  /* In practice, these are not exported by the NDK so don't declare them */
jint JNI_GetDefaultJavaVMInitArgs(void*);
jint JNI_CreateJavaVM(JavaVM**, JNIEnv**, void*);
jint JNI_GetCreatedJavaVMs(JavaVM**, jsize, jsize*);
#endif

Karena satu-satunya cara yang didukung untuk menggunakan NDK adalah dari aplikasi Java sehingga Java JM sudah dimuat.

Saya pikir Anda harus menghapus fungsi main Anda dan mempertimbangkan untuk menggantinya dengan JNI_OnLoad dan menghapus panggilan untuk mengontrol masa pakai VM.

person Richard Critten    schedule 30.04.2015