“getName”的GetMethodID返回NULL

时间:2015-11-16 16:40:16

标签: java android c++ java-native-interface

我一直在尝试从jclass对象中打印出类名。

jmethodID mid_getName = env->GetMethodID(point_class, "getName", "()Ljava/lang/String;");

point_class对象不是NULL。

我使用了Can I know the name of the class that calls a JNI C method?Class name from jclass in JNI

中的这个代码段

另一方面,我正在为android做JNI编程,当我想在本机端创建Java对象时,我的FindClass方法返回NULL。没有进展问题或其他任何问题。

代码:

JNIEXPORT void JNICALL long_JNI_method_name (JNIEnv * env, jobject object, jlong image, jint screenHeight, jint screenWidth) {

jclass point_class = env->GetObjectClass(object);
jmethodID mid_getName = env->GetMethodID(point_class, "getName", "()Ljava/lang/String;");
...

我更改了JNI方法名称,因为它包含了包名(我工作的地方)。

1 个答案:

答案 0 :(得分:1)

您尝试获取getName()的方法object。但是对象(以及从对象派生的类)没有方法getName()getName()是类Class的方法。你的问题就像试图打电话一样

anObject.getName();

而不是正确的

anObject.getClass().getName();

相应的C ++代码必须首先获得调用getClass,并且它可以搜索getName,它可能看起来像:

jclass    point_class = env->GetObjectClass(object);
jmethodID getclass    = env->GetMethodID(point_class, "getClass", "()Ljava/lang/Class;");
jobject   classsObj   = env->CallObjectMethod(object, getclass);
jclass    classclass  = env->GetObjectClass(classsObj);
jmethodID mid_getName = env->GetMethodID(classclass, "getName", "()Ljava/lang/String;");