我在Java中有这个类:
public class CameraActivity extends Activity {
...
public class RecognitionResult {
public String text;
public int x;
public int y;
public int width;
public int height;
public RecognitionResult(String text, int x, int y, int width, int height) {
this.text = text;
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
}
}
这是我的JNI代码:
extern "C"
jobject Java_com_example_parkingcontrolsystem_CameraActivity_recognizeNumberPlate(JNIEnv *env,
jobject object,
jstring filename)
{
jclass cls = env->FindClass("com/example/parkingcontrolsystem/CameraActivity$RecognitionResult");
std::cout << "Class: " << cls << std::endl;
jmethodID constructor = env->GetMethodID(cls, "<init>", "(Ljava/lang/String;IIII)V");
std::cout << "Method: " << constructor << std::endl;
recognition_result = env->NewObject(cls, constructor, "Hello from JNI", 0, 0, 50, 100);
std::cout << "Object: " << recognition_result << std::endl;
return recognition_result;
}
FindClass不返回NULL,OK。但GetMethodID始终返回零。我尝试使用没有args的默认构造函数,而不是使用“()V”签名,但GetMethodID返回NULL。
有什么问题?
答案 0 :(得分:2)
如果使用JNI实例化内部类,则必须在与GetMethodId
一起使用的签名中传递父级,以便接收有效的jmethodID
。
假设B
是A
的内部类,并且有一个类似于public B(int someint)
的构造函数,则以下代码可以正常工作(jobj
指向{{1}的实例}}):
A
运营问题的解决方案是:
jclass jclazz = env->FindClass("org/somepackage/A$B");
assert(jclazz != nullptr);
jmethodID mid = env->GetMethodID(jclazz, "<init>", "(Lorg/somepackage/A;I)V");
assert(mid != nullptr);
env->NewObject(jclazz, mid, jobj, 1);
注意:Selven的评论在评论中也发布了相同的答案,但没有发布答案。