2015-04-30 137 views
2

我尝试从本机代码调用java方法时出错。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"); 
    }  

} 

操作系统:Linux;

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

P.S. 我看到两个类似的问题,但他们并没有帮助解决问题 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

回答

0

从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代替它,并删除调用来控制虚拟机的生命周期。