我试图在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。
先谢谢。
答案 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