我试图在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。
先谢谢你。
这是一个很老的帖子,但这可能对某人还是有用的。
看起来你想创建你自己的java invocator。在这种情况下,你必须使用JNI_CreateJavaVM(.)。调用(*jniENV)->GetJavaVM(...)是为了在java中调用本地代码的情况。在最后一种情况下,本地函数会传递一个jniENV参数。
更多信息请参见 https:/docs.oracle.comjavase8docstechnotesguidesjnispecinvocation.html#JNI_CreateJavaVM。