开发者

Android - JNI NewObject() does not save values when passing it to Java

开发者 https://www.devze.com 2023-04-13 00:21 出处:网络
I am using native code to create an object which I then pass as an argument to a method I call. Nothing appears to go wrong in native code, but when I get the call in Java, the object seems to have nu

I am using native code to create an object which I then pass as an argument to a method I call. Nothing appears to go wrong in native code, but when I get the call in Java, the object seems to have nulled values.

Here's the code of the java object I create in native:

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);
    }

}

Here's the native code used to create an instance of the class and pass it up to the Java method "onGetTeam", which takes an instance of the above class as a parameter. It is run from a thread created in Native code, hence I have to attach the thread.

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 && dataObje开发者_开发技巧ct) {
                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");
                }
            }

I do not want the object to be persistent; I want it to ony be valid during the call to Java, then it can be garbage-collected. However its data fields - that are set in the constructor - are just null when I call it, Why?


You're not passing the object you constructed to the method (or indeed doing anything with it).

Instead of

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

don't you want

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

?

Also you're not checking whether that call succeeded or not.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号