1
我使用本地代码创建一个对象,然后将其作为参数传递给我调用的方法。 在本地代码中没有出现任何错误,但是当我使用Java进行调用时,该对象似乎没有值。Android - JNI NewObject()在将值传递给Java时不保存值
下面是我在本地创建的java对象的代码:
package org.test;
import java.util.ArrayList;
public class JNITeam {
public int mTeamID;
public String mTeamName;
private ArrayList<String> mMembers;
public JNITeam(int id, String name) {
mTeamID = id;
mTeamName = name;
}
public void addMember(String name) {
mMembers.add(name);
}
}
下面是用于创建类的实例,并把它传递到Java方法“onGetTeam”,这需要一个本机代码上述类的实例作为参数。它是从本地代码中创建的线程运行的,因此我必须附加该线程。
JNIEnv* jenv = 0;
clientHandle->runningJVM->AttachCurrentThread(&jenv,0);
if (!jenv)
__android_log_print(ANDROID_LOG_INFO, ANDROID_DEBUG_TAG, "jenv is null");
jclass cls = jenv->GetObjectClass(clientHandle->job);
if (!cls)
__android_log_print(ANDROID_LOG_INFO, ANDROID_DEBUG_TAG, "cls is null");
jmethodID constructor = jenv->GetMethodID(clientHandle->JNITeamCls, "<init>", "(ILjava/lang/String;)V");
jint teamID = 2;
jstring js = jenv->NewStringUTF("test");
jobject dataObject = jenv->NewObject(clientHandle->JNITeamCls, constructor, teamID, js);
if (!dataObject)
__android_log_print(ANDROID_LOG_INFO, ANDROID_DEBUG_TAG, "dataobject is null");
if (jenv && cls && dataObject) {
jmethodID mid = jenv->GetMethodID(cls,"onGetTeam","(Lorg/test/JNITeam;)V");
if (mid) {
jenv->CallVoidMethod(clientHandle->job,mid);
}
else {
__android_log_print(ANDROID_LOG_INFO, ANDROID_DEBUG_TAG, "mid is null");
}
}
我不希望该对象是持久性的;我希望它在调用Java期间有效,然后它可以被垃圾收集。然而,当我调用它时,它的数据字段(在构造函数中设置)仅为null,为什么?
aww不敢相信我错过了。谢谢 – KaiserJohaan