gpt4 book ai didi

android - 调用 CallVoidMethod 时 JNI 崩溃

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:02:53 25 4
gpt4 key购买 nike

我正在尝试从 Android 应用程序中的 native C 代码调用 java 方法。使用 JNI 这听起来很简单,但我的代码在最终调用方法本身时总是崩溃。这是我的代码: native C 代码:

JNIEXPORT void JNICALL
Java_com_path_to_my_package_renderStuff(JNIEnv* env, jobject jobj){
//...
jclass clazz = env->FindClass("com/path/to/the/class");
jmethodID showCar = env->GetMethodID(clazz,"showCar","()V" );
env->CallVoidMethod(jobj,showCar); //If I comment this out, it won't crash
//...
}

Java 代码:

public void showCar(){      
doSomething()
}

doSomething() 甚至没有达到,我可以在那里设置一个断点,它永远不会被击中。如上所述,一旦我注释掉 CallVoidMethod 调用,它就不会崩溃,但显然也不会调用 showCar() 。有什么提示吗?

最佳答案

为您提供的 4 个想法:

...

jclass clazz = env->FindClass("com/path/to/the/class");

您能否确认名称不是“com/path/to/the/MyClass”,其中类名是大写的第一个字符,显然名称“class”是保留字。在您的示例中,JNI C 符号名称“Java_com_path_to_my_package_renderStuff”的使用与“com/path/to/the/class”上的 FindClass() 查找之间存在细微差异。但是由于您的 stackoverflow 与 UnsatisfiedLinkageError 无关,我只能猜测您提供的示例与自身不一致。

使用我的示例,我希望 JNI C 符号名称为“Java_com_path_to_the_MyClass_renderStuff”,FindClass() 查找“com/path/to/the/MyClass”。使用类的第一个大写字母和方法名称的第一个小写字母对于链接目的可能很重要。

...

您确定传递的“jobj”与您正在查找的“com/path/to/the/class”是同一类型吗?也许在您的 Java 代码中,您可以使用以下代码包装您的原生代码:

public void renderStuff() {
if((this instanceof com.path.to.the.MyClass) == false)
throw new RuntimeException("Unexpected class expected: com.path.to.the.MyClass");
renderStuff_internal();
}
private native void renderStuff_internal();

这将确保在 Java 代码中很重要,而不会导致 JVM 崩溃。您还需要调整您的 C 符号名称以将“_1internal”附加到“Java_com_path_to_the_MyClass_renderStuff_1internal”的末尾(额外的“1”字符是有意的)

...

也许在你列出的每条语句之间尝试带和大括号异常检查:

if(env->ExceptionCheck()) {
env->ExceptionDescribe();
env->ExceptionClear();
}

这将在可能不允许的情况下尝试进行反射时发现诸如安全违规之类的事情。

...

 jclass cls = env->GetObjectClass(jobj);  // instead of FindClass
jmethodID mid = env->GetMethodID(cls, "showCar", "()V");
if(!mid) return; // whoops method does not exist
env->CallVoidMethod(jobj, mid);

删除 FindClass() 调用的另一个想法。这适用于 GetMethodID 处理的任何类,有点像动态输入/后期绑定(bind)。

关于android - 调用 CallVoidMethod 时 JNI 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7530821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com