JNI实施过程中出现 "分段故障 "错误。

问题描述 投票:0回答:1

我试图在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运行这个程序时,它给我 "Segmenation Fault "错误。

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

顺便说一下,我在Windows 7中使用android studio。

先谢谢你。

android android-studio java-native-interface
1个回答
0
投票

这是一个很老的帖子,但这可能对某人还是有用的。

看起来你想创建你自己的java invocator。在这种情况下,你必须使用JNI_CreateJavaVM(.)。调用(*jniENV)->GetJavaVM(...)是为了在java中调用本地代码的情况。在最后一种情况下,本地函数会传递一个jniENV参数。

更多信息请参见 https:/docs.oracle.comjavase8docstechnotesguidesjnispecinvocation.html#JNI_CreateJavaVM。

© www.soinside.com 2019 - 2024. All rights reserved.