Android-JNI NewObject()在将值传递给Java时不保存值

Android-JNI NewObject()在将值传递给Java时不保存值,android,c++,java-native-interface,android-ndk,Android,C++,Java Native Interface,Android Ndk,我使用本机代码创建一个对象,然后将其作为参数传递给我调用的方法。 在本机代码中似乎没有什么问题,但是当我在Java中得到调用时,对象似乎有空值 以下是我在本机中创建的java对象的代码: package org.test; import java.util.ArrayList; public class JNITeam { public int mTeamID; public String mTeamName; private ArrayList<String&g

我使用本机代码创建一个对象,然后将其作为参数传递给我调用的方法。 在本机代码中似乎没有什么问题,但是当我在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);
    }

}
package-org.test;
导入java.util.ArrayList;
公共类JNITeam{
公共int mTeamID;
公共字符串mTeamName;
私有数组列表成员;
公共JNITeam(整数id,字符串名称){
mTeamID=id;
mTeamName=名称;
}
public void addMember(字符串名称){
m成员。添加(名称);
}
}
下面是用于创建类实例并将其传递给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");
                }
            }
JNIEnv*jenv=0;
clientHandle->runningJVM->AttachCurrentThread(&jenv,0);
如果(!jenv)
__安卓日志打印(安卓日志信息,安卓调试标签,“jenv为空”);
jclass cls=jenv->GetObjectClass(clientHandle->job);
如果(!cls)
__安卓日志打印(安卓日志信息,安卓调试标签,“cls为空”);
jmethodID构造函数=jenv->GetMethodID(clientHandle->JNITeamCls,”,“(ILjava/lang/String;)V);
jint-teamID=2;
jstringjs=jenv->NewStringUTF(“测试”);
jobject dataObject=jenv->NewObject(clientHandle->JNITeamCls,构造函数,teamID,js);
如果(!dataObject)
__安卓日志打印(安卓日志信息,安卓调试标签,“数据对象为空”);
if(jenv&&cls&&dataObject){
jmethodID mid=jenv->GetMethodID(cls,“onGetTeam”,“Lorg/test/JNITeam;)V);
如果(中){
jenv->CallVoidMethod(clientHandle->job,mid);
}
否则{
__安卓日志打印(安卓日志信息,安卓调试标签,“mid为空”);
}
}

我不希望对象是持久的;我希望它在调用Java时是有效的,然后它可以被垃圾收集。然而,当我调用它时,它的数据字段(在构造函数中设置)只是空的,为什么?

您没有将构建的对象传递给该方法(或者确实没有使用它做任何事情)

而不是

                jenv->CallVoidMethod(clientHandle->job,mid);
你不想要吗

                jenv->CallVoidMethod(clientHandle->job,mid,dataObject);
?


你也没有检查那个电话是否成功。

aww真不敢相信我错过了。谢谢