【问题标题】:jni passing class object as a parameterjni 将类对象作为参数传递
【发布时间】:2011-07-25 07:13:04
【问题描述】:

我有一个类有另一个类的对象。当我通过 jobject 将该对象传递给我的 jni 函数时,getFieldID 说它找不到该字段。变量名肯定是对的

jfieldID fidPopulation = (*env)->GetFieldID(env,cls,"mPopulation","I");

【问题讨论】:

  • 关于你是否让它工作的任何更新?
  • 得到一个类未找到异常。如果 b 类与 a 类在不同的包中,这有关系吗?
  • 您应该使用类的完整包名路径调用 findClass。 A和B存在的包无关紧要
  • 所以 com.test.callactivity 应该是 com/test/callactivity 吧?

标签: java-native-interface android-ndk


【解决方案1】:

在此函数中,您尝试访问一个名为 mPopulation 的整数类型字段。从您的问题来看,您似乎正在尝试访问对象字段。 “I”表示它是一个整数。如果你想获取一些对象,你应该给它的路径一些东西,比如“org/abc/MyClass”
我正在根据下面的 cmets 添加一些代码。
objectA 由 JVM 传递,是调用该函数的对象。 objectB 是一个参数,是类 org/demopath/ClassB.java 的对象,从 java 传递给测试函数。

    Java_MyTestFunction( JNIEnv *env, jobject objectA, jobject objectB) {  
        jclass cls = (*env)->FindClass(env, "org/demopath/ClassB");  
        jfieldID fid = (*env)->GetFieldID(env, cls, "mPopulation ", "I");  
        jint population = (*env)->GetIntField(env, objectB, fid);  
    }      

我已经对签名进行了手工编码,因此可能存在一些错误。始终使用生成的签名

【讨论】:

  • 很抱歉给您带来了困惑。让我解释一下我想做什么。我有一个 A 类,它包含 B 类的一个对象,它有一个成员 mPopulation 和一些我想从 jni 访问的其他成员。 jni is函数是从A类中调用的。如何访问jni中B类的对象及其对应的成员??
  • 由于您是从 A 的对象调用 JNI,因此请使用该对象,该对象将成为函数签名中的第二个参数。如上所述,从类 A 中获取对象 b 的 fieldID。使用它来获取对对象 B 的引用。然后使用它来获取 B 中的字段参见java.sun.com/developer/onlineTraining/Programming/JDCBook/…
  • 即使在对象 A 的函数中声明了对象 b 也会起作用吗??
  • 没有。您必须将该对象作为函数参数传递给 JNI。这样会更容易
  • 你能提供一些代码吗?我不确定如何获取对象部分的字段ID。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-10
  • 2012-03-30
  • 2012-09-16
相关资源
最近更新 更多