ndk-build 'JNI_CreateJavaVM' ไม่ได้ถูกประกาศในขอบเขตนี้

ฉันมีข้อผิดพลาดขณะพยายามเรียกใช้วิธีจาวาจากโค้ดเนทีฟ

[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

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

}

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

}

ระบบปฏิบัติการ: ลินุกซ์;

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

ป.ล. ฉันได้เห็นคำถามที่คล้ายกันสองข้อ แต่ไม่ได้ช่วยแก้ปัญหา การเรียกวิธี JAVA จาก C++ ด้วย JNI ไม่มีพารามิเตอร์ การใช้ JNI เพื่อรัน java jar จากโปรแกรม C++ โดยใช้ g++ หรือ eclipse


person Oxide Alluminum    schedule 30.04.2015    source แหล่งที่มา


คำตอบ (1)


จาก 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

เนื่องจากวิธีเดียวที่รองรับในการใช้ NDK คือจากแอปพลิเคชัน Java ดังนั้น Java JM จึงถูกโหลดไว้แล้ว

ฉันคิดว่าคุณควรลบฟังก์ชัน main ของคุณออกและลองแทนที่ด้วย JNI_OnLoad และลบการเรียกออกเพื่อควบคุมอายุการใช้งานของ VM

person Richard Critten    schedule 30.04.2015