在JNI方法上返回一个String数组

Mar*_*los 17 arrays java-native-interface android android-ndk

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

我怎样才能做到这一点?

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

Fra*_*ita 25

看看NewObjectArrayJNI文档.

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

Peudo代码:

Java的:

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

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);
 }
Run Code Online (Sandbox Code Playgroud)

没测试!!!

如果它适用于你,请告诉我

问候

  • 我刚发现它是"()[Ljava/lang/String;" (2认同)

小智 5

ret= (jobjectArray)env->NewObjectArray(5,env->FindClass("java/lang/String"),env->NewStringUTF(""));
Run Code Online (Sandbox Code Playgroud)

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

env->NewStringUTF("")
Run Code Online (Sandbox Code Playgroud)

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

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

在这种情况下,一个简单的"NULL"就足够了,因为一旦执行下一行,指定的初始元素就可以进行垃圾收集.这就像在Java代码中编写以下内容:

int i = 0;
i = 1;
Run Code Online (Sandbox Code Playgroud)

或者更糟:

Object object = new BigObjectVeryHeavyToInitialize();
object = new AnotherObject();
Run Code Online (Sandbox Code Playgroud)

您最喜欢的IDE会向您发出一点警告.