jni:java给c++传递参数,包括一个对象,以及对象中的对象出现错误
我有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)