为什么JNI中的GetMethodID总是返回0

heavensquare_fu 2009-12-10 03:43:04
已经使用了javap看过signature了
下面是C++代码
mid = env->GetMethodID(cls, "append","(Ljava/lang/String;I)Ljava/lang/String;");

mid=env->GetMethodID(cls,"HelloWord","()Ljava/lang/String;");

下面是javap的显示:
public test.MyTest(java.lang.String);
Signature: (Ljava/lang/String;)V
public java.lang.String HelloWord();
Signature: ()Ljava/lang/String;
public java.lang.String append(java.lang.String, int);
Signature: (Ljava/lang/String;I)Ljava/lang/String;

下面是java代码:
public String HelloWord() {
System.out.println("JAVA-CLASS:MyTest method:HelloWord:" +
helloword);

return helloword;
}
//test
public String append(String str, int i)
{
return str + i;
}
...全文
589 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
yzy12960 2011-01-28
  • 打赏
  • 举报
回复
顶,我也碰到这种问题郁闷中
heavensquare_fu 2009-12-11
  • 打赏
  • 举报
回复
关键是怎么解决getmethodid这个函数,就是为什么构造函数<init>可以返回有值,其它函数则返回0
heavensquare_fu 2009-12-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wind_runner 的回复:]

就是.H文件使用javah生成的, 与你的JAVA类名是对应的
[/Quote]

呃。。。貌似用c++调用JAVA不需要用javah生成头文件吧~
Wind_Runner 2009-12-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 heavensquare_fu 的回复:]
引用 3 楼 eyodo8 的回复:
需要先找到类位置不能错,还有注意.h文件不能被修改,包括文件名
下面是我实现jni中的查找方法的一段代码给你参考。
jclass clsArrayList = env->FindClass("java/util/ArrayList");
jmethodID ctrArrayList = env->GetMethodID(clsArrayList, " <init>", "()V");
jmethodID addArrayList = env->GetMethodID(clsArrayList, "add", "(Ljava/lang/Object;)Z");


问题是类是找到了的, <init>函数的ID也是ok了的,但是其他的函数ID返回0

另外,“.h文件不能修改包括文件名”是啥意思,
[/Quote]

就是.H文件使用javah生成的, 与你的JAVA类名是对应的
heavensquare_fu 2009-12-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 eyodo8 的回复:]
需要先找到类位置不能错,还有注意.h文件不能被修改,包括文件名
下面是我实现jni中的查找方法的一段代码给你参考。
jclass clsArrayList = env->FindClass("java/util/ArrayList");
jmethodID ctrArrayList = env->GetMethodID(clsArrayList, " <init>", "()V");
jmethodID addArrayList = env->GetMethodID(clsArrayList, "add", "(Ljava/lang/Object;)Z");
[/Quote]

问题是类是找到了的,<init>函数的ID也是ok了的,但是其他的函数ID返回0

另外,“.h文件不能修改包括文件名”是啥意思,
eyodo8 2009-12-10
  • 打赏
  • 举报
回复
需要先找到类位置不能错,还有注意.h文件不能被修改,包括文件名
下面是我实现jni中的查找方法的一段代码给你参考。
jclass clsArrayList = env->FindClass("java/util/ArrayList");
jmethodID ctrArrayList = env->GetMethodID(clsArrayList, "<init>", "()V");
jmethodID addArrayList = env->GetMethodID(clsArrayList, "add", "(Ljava/lang/Object;)Z");
heavensquare_fu 2009-12-10
  • 打赏
  • 举报
回复
自己顶~
heavensquare_fu 2009-12-10
  • 打赏
  • 举报
回复
都没人知道吗?

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧