【问题标题】:GetMethodID for "getName" is returning NULL“getName”的 GetMethodID 返回 NULL
【发布时间】:2015-11-16 16:40:16
【问题描述】:

我一直在尝试从 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 的这个sn-p

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

代码:

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 方法名称,因为其中包含包名称(我工作的地方)。

【问题讨论】:

  • 发布所有你的代码。你漏掉了什么。
  • 贴出源代码。

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


【解决方案1】:

您尝试获取object 的方法getName()。但是对象(以及从对象派生的类)没有方法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;");

【讨论】:

  • 非常感谢。这个建议救了我。
【解决方案2】:

稍微简单的版本:

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

【讨论】:

  • env->GetObjectClass(object_class) 也可以替换为 env->FindClass("java/lang/Class");
猜你喜欢
  • 1970-01-01
  • 2014-10-11
  • 2020-02-05
  • 1970-01-01
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 2019-10-13
  • 1970-01-01
相关资源
最近更新 更多