jni:java给c++传递参数,包括一个对象,以及对象中的对象出现错误

fangwc 2015-04-24 02:42:36
我有3个java类,分别是ScoreInfo,UserInfo,nativeCethond:具体如下:
//ScoreInfo类
public class ScoreInfo {
​private String id;
​private String Score;
​public ScoreInfo(String id, String score) {
​ ​super();
​ ​this.id = id;
​ ​Score = score;
​}
​public String getId() {
​ ​return id;
​ } ​
​ public void setId(String id) {
​ ​this.id = id;
​ }
​ public String getScore() {
​ ​return Score;
​ ​}
​ public void setScore(String score) {
​ ​ ​Score = score;
}
}

//UserInfo类 包含ScoreInfo类
public class UserInfo {

​ private String id;
​ private String name;
​ private String pwd;
​ private ScoreInfo score;

​ public UserInfo(String id, String name, String pwd) {
​ ​ super();
​ ​ this.id = id;
​ ​ this.name = name;
​ ​ this.pwd = pwd;
​ }

​ public UserInfo(String id, String name, String pwd, ScoreInfo score) {
​ ​ super();
​ ​ this.id = id;
​ ​ this.name = name;
​ ​ this.pwd = pwd;
​ ​ this.score = score;
​ }

​ public String getId() {
​ ​ return id;
​ }

​ public void setId(String id) {
​ ​ this.id = id;
​ }

​ public String getName() {
​ ​ return name;
​ }

​ public void setName(String name) {
​ ​ this.name = name;
​ }

​ public String getPwd() {
​​ return pwd;
​ }

​ public void setPwd(String pwd) {
​ ​ this.pwd = pwd;
​ }

​ public ScoreInfo getScoreInfo() {
​ ​ return score;
​ }

​ public void setScore(ScoreInfo score) {
​ ​ this.score = score;
​ }

}

//java主函数
public class nativeCethond {

​ ​ static {
​ ​ ​ ​ System.loadLibrary("userBean");
​ ​ }
​ ​
​ ​ ​ ​public native String setUser(UserInfo user);
​ ​
​ ​ public static void main(String[] args) {
​ ​
​ ​ ​ ​ ScoreInfo score = new ScoreInfo("001", "100");
​ ​ ​ ​ UserInfo user = new UserInfo("1001", "ygang", "12345", score);
​ ​ ​ ​ nativeCethond text = new nativeCethond();
​ ​ ​
//传送一个user对象给c++
​ String name = text.setUser(user);
​ ​ ​ ​
​ ​ ​ ​ System.out.println("My name is ===" + name);
​ ​ ​ ​
​ ​ }
}
java把user对象传递给c++:
c++的代码如下:

JNIEXPORT jstring JNICALL Java_nativeCethond_setUser
(JNIEnv *env, jobject obj, jobject dd)
{
​ ​ jmethodID methodId;
​ ​ jclass objclass = env->GetObjectClass(dd);

//读取user对象中的信息 ​
​ ​ methodId = env->GetMethodID(objclass,"getName","()Ljava/lang/String;");
​ ​ jstring js_name = (jstring)env->CallObjectMethod(dd,methodId,NULL);

//读取user对象中的信息 ​ ​
​ ​ jmethodID methodId2 = env->GetMethodID(objclass,"getId","()Ljava/lang/String;");
​ ​ jstring js_id = (jstring)env->CallObjectMethod(dd,methodId2,NULL);
​ ​
//读取user对象中的信息
​ ​ jmethodID methodId3 = env->GetMethodID(objclass,"getPwd","()Ljava/lang/String;");
​ ​ jstring js_pwd = (jstring)env->CallObjectMethod(dd,methodId3,NULL);
​ ​
​ ​ //read a class,这里有错误,不知如何读取,user中ScoreInfo类对象的值
​ ​ jmethodID methodId4 = env->GetMethodID(objclass,"getScore","()Ljava/lang/String;");
​ ​ // jobject score_obj = env->CallObjectMethod(dd,methodId4,NULL);
​ ​ // jclass score_obj2 = env->GetObjectClass(score_obj);
​ ​ // jmethodID methodId5 = env->GetMethodID(score_obj2,"getId","()Ljava/lang/String;");
​ ​ // jstring js_score_id = (jstring)env->CallObjectMethod(score_obj2,methodId5,NULL);
​ ​ return js_id;
}
错误在c中调用对象的对象时发生了:
jmethodID methodId4 = env->GetMethodID(objclass,"getScore","()Ljava/lang/String;");

Exception in thread "main" java.lang.NoSuchMethodError: getScoreInfo
at nativeCethond.setUser(Native Method)
at nativeCethond.main(nativeCethond.java:14)
...全文
46 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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