我正在开发一个Android应用程序,它使用JNI代码进行一些CPU密集型计算。我在Java上的一个本机方法将ArrayList作为参数传递给JNI层。
当我尝试使用ArrayList的get(int index)时:
jmethodID getAtIndex = env->GetMethodID(listClass, "get", "(I)Ljava/lang/Object");
我得到了:
NoSuchMethodError: no method with name='get' signature=
'(I)Ljava/lang/Object' in class Ljava/util/ArrayList;
但是,当我使用javap -s java.util.ArrayList获取该方法的签名时,我得到的签名与我在JNI代码上使用的签名完全相同。
有什么想法吗? 在此先感谢!!
答案 0 :(得分:4)
您在类型签名的末尾缺少分号,Java类类型签名的格式如下:
L fully-qualified-class-name ;
因此Object
为Ljava/lang/Object;
,方法的完整类型签名为(I)Ljava/lang/Object;
。
答案 1 :(得分:4)
你签名错了。不要手工构建JNI签名:从javap -s的输出中复制和粘贴。在这种情况下,你错过了一个分号。