我试着从c调用几个非静态的java方法,我检查过是否有任何对象、方法或环境变量为空,没有一个是空的。当我使用静态方法而不是非静态方法时,程序运行得很好。
JavaVM *jvm;
jobject g_obj;
jmethodID g_mid;
void func(){
jclass DTK_ANPR_Test;
jmethodID dtk_anpr;
DTK_ANPR_Test = (*env)->FindClass(env, "DTKANPRTest");
g_mid = (*env)->GetMethodID(env, DTK_ANPR_Test, "anpr", "(I)V");
jobject obj = (*env)->NewObjectA(env, DTK_ANPR_Test, g_mid, val);
g_obj = (*env)->NewGlobalRef(env, DTK_ANPR_Test);
}当我从同一个方法或另一个方法调用(*env)->CallVoidMethodA(env, g_obj, g_mid, val);时,程序就会崩溃。是对象的问题还是别的什么问题?
另一次,我使用AttachCurrentThread和DetachCurrentThread从本机代码中调用该方法
附言:还有另一个类似的帖子,它没有解决我的问题:JNI crashes when calling CallVoidMethod
发布于 2015-04-30 10:01:49
要从GetMethodId返回类的构造函数,请传递<init>作为方法名,而不是类名。来自the docs
jobject NewObjectA(JNIEnv *env,jclass clazz,jmethodID methodID,const jvalue *args);
构造一个新的Java对象。方法ID指示要调用的构造函数方法。此ID必须通过调用GetMethodID()获得,方法名为<init>,返回类型为void (V)。
因此,将代码更改为:
g_mid = (*env)->GetMethodID(env, DTK_ANPR_Test, "<init>", "(I)V");此外,您不会保存对使用NewObjectA创建的对象的引用。将您的代码更改为:
g_obj = (*env)->NewGlobalRef(env, obj);您的代码之所以适用于静态方法,是因为在调用静态方法时使用的是类对象,而不是对象实例。
https://stackoverflow.com/questions/29944343
复制相似问题