java - "getName"的 GetMethodID 返回 NULL

标签 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? 中的这个 fragment 和 Class name from jclass in JNI

另一方面,我正在为 android 进行 JNI 编程,当我想在 native 端创建 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 方法名称,因为它包含包名称(我工作的地方)。

最佳答案

您尝试获取对象 的方法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;");

关于java - "getName"的 GetMethodID 返回 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33740324/

相关文章:

java - onOptionsItemSelected(MenuItem item) 奇怪的行为

c++ - 如何使用 Gtkmm 获取光标位置?

android - 我应该使用 Service 还是 IntentService?

java - 我可以在一个 SwingWorker 中运行另一个 SwingWorker 吗?

java - 如何在ListView中按最大int值排列Firestore中的数据

java - 为什么空项目有很大的内存分配?

java - 转换设备发现不适用于我的应用程序 ID

c++ - 仅 header 库中的全局变量

c++ - 如何以编程方式更改 Qt 中按钮的样式表?

java - 在textView中一一显示ArrayList中的值