gpt4 book ai didi

java - JNI GetMethodID 不适用于内部类的构造函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:05:39 28 4
gpt4 key购买 nike

我有一个带有私有(private)子类的类。我想在 JNI 包装器中创建该子类的实例并将其返回。我用谷歌搜索并试图让它工作但没有成功(methodID 为空)。有什么建议吗?

JNIEXPORT jobject JNICALL Java_some_Class_some_Jni_Method(JNIEnv *env, jobject this) {
jclass cls = (*env)->FindClass(env, "someClass$someSubclass");
if (cls == NULL)
printf("jclass error.");

jmethodID methodID = (*env)->GetMethodID(env, cls, "<init>", "()V"); // -> problem!
if (methodID == NULL)
printf("jmethodID error.");

jobject obj = (*env)->NewObject(env, cls, methodID);
if (obj == NULL)
printf("jobject error.");

return obj;
}

EDIT1:添加类定义:

public class someClass 
{
private class someSubclass {

public someSubclass() {
}
...
}
...
}

EDIT2:好的,我发现您需要 GetMethodID 签名中的父类,因此在我的示例中:jmethodID methodID = (*env)->GetMethodID(env, cls, "<init>", "(LsomeClass;)V");

但现在我使用 NewObject 函数得到了 EXCEPTION_ACCESS_VIOLATION。

EDIT3:我还需要将调用类对象/指针添加到 NewObject 函数:jobject obj = (*env)->NewObject(env, cls, methodID, this);

现在可以正确调用嵌套类的构造函数。

最佳答案

您需要在 GetMethodID 签名中添加父类,因此在我的示例中: jmethodID methodID = (*env)->GetMethodID(env, cls, "<init>", "(LsomeClass;)V");

我还需要将调用类对象/指针添加到 NewObject 函数: jobject obj = (*env)->NewObject(env, cls, methodID, this);

关于java - JNI GetMethodID 不适用于内部类的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25363027/

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