【问题标题】:Return a String array on a JNI method在 JNI 方法上返回一个字符串数组
【发布时间】:2011-08-28 04:15:54
【问题描述】:

我需要从 C++ 中获取一个字符串列表 (char*) 并将其返回给 Java。

我该怎么做?

我认为一种解决方案是返回一个预定义的大字符串,例如:“[item1][item2]”并在 Java 上进行拆分,但这看起来不是正确的方法。

【问题讨论】:

    标签: android arrays java-native-interface android-ndk


    【解决方案1】:
    ret= (jobjectArray)env->NewObjectArray(5,env->FindClass("java/lang/String"),env->NewStringUTF(""));
    

    我认为初始元素初始化为“”(空字符串)

    env->NewStringUTF("")
    

    不需要,因为您在之后为数组元素分配了一个新值:

    for(i=0;i<5;i++) env->SetObjectArrayElement(ret,i,env->NewStringUTF(data[i]));
    

    在这种情况下,一个简单的“NULL”就足够了,因为一旦执行下一行,指定的初始元素就可以用于垃圾回收。这就像在 Java 代码中编写以下代码:

    int i = 0;
    i = 1;
    

    或者更糟:

    Object object = new BigObjectVeryHeavyToInitialize();
    object = new AnotherObject();
    

    您最喜欢的 IDE 会为此向您发出一点警告。

    【讨论】:

    • 没错。为空的初始化字符串分配内存可能会导致内存泄漏,因为它们不会自动删除。
    【解决方案2】:

    在 JNI 文档中查看 NewObjectArray

    基本上,您可以从 JNI 函数返回一个字符串数组 (Java),然后将其转换为 List 或任何类型的集合类型。

    伪代码:

    Java:

    ....
    public List<String> getFooAsList(){
      return new ArrayList(this.getData());
    }  
    private native String[] getData();
    

    JNI

    #include <jni.h>
    
    
      JNIEXPORT jobjectArray JNICALL 
                   como_foo_bar_getData
      (JNIEnv *env, jobject jobj){
    
        jobjectArray ret;
        int i;
    
        char *data[5]= {"A", "B", "C", "D", "E"};
    
        ret= (jobjectArray)env->NewObjectArray(5,env->FindClass("java/lang/String"),env->NewStringUTF(""));
    
        for(i=0;i<5;i++) env->SetObjectArrayElement(ret,i,env->NewStringUTF(data[i]));
    
        return(ret);
     }
    

    未测试!!!

    让我知道它是否适合你

    问候

    【讨论】:

    • 还有一个问题,我在 jni_onLoad 绑定方法中使用的数据类型是什么? { "getTOC", "()", reinterpret_cast(& Java_com_rmsdk_wrapper_RMServices_getTOC)}
    • 我刚刚发现它是"()[Ljava/lang/String;"
    • 另一个问题:如果SetObjectArrayElement 抛出异常会发生什么?如何清理分配的数组?你返回ret 还是NULL
    • char *data[5]= {"A", "B", "C", "D", "E"};现已弃用。这将在 gradle 控制台中显示警告消息。
    猜你喜欢
    • 1970-01-01
    • 2018-12-16
    • 2020-06-16
    • 2015-06-09
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多