【问题标题】:ndk-build 'JNI_CreateJavaVM' was not declared in this scopendk-build 'JNI_CreateJavaVM' 未在此范围内声明
【发布时间】:2015-04-30 21:19:55
【问题描述】:

尝试从本机代码调用 java 方法时出错。

[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

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

}

操作系统:Linux;

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

附: 我见过两个类似的问题,但它们无助于解决问题 Calling a JAVA method from C++ with JNI, no parameters Using JNI to execute a java jar from a C++ program, using g++ or eclipse

【问题讨论】:

    标签: java android c++ android-ndk


    【解决方案1】:

    来自 NDK 的 jni.h

    #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 生命周期的调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-20
      • 2016-08-09
      • 2019-02-17
      • 2021-01-07
      相关资源
      最近更新 更多