首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我调用CallVoidMethodA时程序崩溃

当我调用CallVoidMethodA时程序崩溃
EN

Stack Overflow用户
提问于 2015-04-29 20:53:06
回答 1查看 462关注 0票数 0

我试着从c调用几个非静态的java方法,我检查过是否有任何对象、方法或环境变量为空,没有一个是空的。当我使用静态方法而不是非静态方法时,程序运行得很好。

代码语言:javascript
复制
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);时,程序就会崩溃。是对象的问题还是别的什么问题?

另一次,我使用AttachCurrentThreadDetachCurrentThread从本机代码中调用该方法

附言:还有另一个类似的帖子,它没有解决我的问题:JNI crashes when calling CallVoidMethod

EN

回答 1

Stack Overflow用户

发布于 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)。

因此,将代码更改为:

代码语言:javascript
复制
g_mid = (*env)->GetMethodID(env, DTK_ANPR_Test, "<init>", "(I)V");

此外,您不会保存对使用NewObjectA创建的对象的引用。将您的代码更改为:

代码语言:javascript
复制
g_obj = (*env)->NewGlobalRef(env, obj);

您的代码之所以适用于静态方法,是因为在调用静态方法时使用的是类对象,而不是对象实例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29944343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档