"分段错误" JNI实施期间的错误

时间:2015-09-03 22:20:22

标签: android android-studio java-native-interface

我试图在android studio中使用JNI接口从C调用java方法。

这是我的C代码:

#include <stdio.h>
 #include<jni.h>

 int main(int argc, char **argv)
 {

     //printf("Android Test Application.\n");
     //return 0;
     static JNIEnv* jniENV;
     int exiting;
     JavaVM* jvm;
     jint number=20;

     printf("1");
     int gotVM = (*jniENV)->GetJavaVM(jniENV,&jvm);
     //LOGI("Got JVM: %s", (gotVM ? "false" : "true") );
     jclass javaClass;
     jmethodID javaMethodId;

     //javaClass= (*jniENV)->FindClass(jniENV, "java/einfo/NDKSample/MainActivity");
     printf("2");
     javaClass= (*jniENV)->FindClass(jniENV, "MainActivity");
     printf("3");
     javaMethodId= (*jniENV)->GetStaticMethodID(jniENV, javaClass, "square", "(I)I");
     printf("4");

     printf("%d squared is %d\n", number,(*jniENV)->CallStaticIntMethod(jniENV, javaClass, javaMethodId,number));
     //(*jniENV)->CallStaticIntMethod(jniENV, javaClass, javaMethodId,number);
    return 0;
 }

当我尝试使用abd shell运行此程序时,它给了我&#34; Segmenation Fault&#34;错误。

我是JNI和C的新手,请帮我找出问题的根本原因。

仅供参考,我在Windows 7中使用android studio。

先谢谢。

1 个答案:

答案 0 :(得分:0)

这是一个非常老的线程,但这对某人可能仍然有用。

您似乎想创建自己的Java Invocator。在这种情况下,您必须使用JNI_CreateJavaVM(..)。调用(* jniENV)-> GetJavaVM(...)用于从Java调用本机代码的情况。在最后一种情况下,本机函数传递jniENV参数。

有关更多信息,请参见https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/invocation.html#JNI_CreateJavaVM