Java 在JNI层中填充字符串数组

Java 在JNI层中填充字符串数组,java,java-native-interface,Java,Java Native Interface,我是Java编程新手,有一个基本问题。我想向JNI层传递一个字符串数组。在JNI函数中,数组可以用字符串填充吗?所有的帖子要么讨论如何从JNI层返回字符串数组,要么讨论如何在JNI层解析字符串数组。可能吗 谢谢是的,这是可能的。有一种方法可以完全满足您的需求。您需要从JNI端创建数组和字符串(类似于在java中调用新字符串(char[]))。Unicode和UTF-8都受支持(每个都有一个JNI函数集) #包括 #包括“ArrayHandler.h” JNIEXPORT jobjectArray

我是Java编程新手,有一个基本问题。我想向JNI层传递一个字符串数组。在JNI函数中,数组可以用字符串填充吗?所有的帖子要么讨论如何从JNI层返回字符串数组,要么讨论如何在JNI层解析字符串数组。可能吗


谢谢

是的,这是可能的。有一种方法可以完全满足您的需求。您需要从JNI端创建数组和字符串(类似于在java中调用
新字符串(char[])
)。Unicode和UTF-8都受支持(每个都有一个JNI函数集)

#包括
#包括“ArrayHandler.h”
JNIEXPORT jobjectArray JNICALL Java_ArrayHandler_returnArray
(JNIEnv*env,jobject-jobj)
{
jobject数组ret;
int i;
字符*消息[5]={“第一”,
“第二”,
“第三”,
“第四”,
“第五”};
ret=(jobjectArray)env->NewObjectArray(5,
env->FindClass(“java/lang/String”),
env->NewStringUTF(“”);
对于(i=0;iSetObjectArrayElement)(
ret,i,env->NewStringUTF(消息[i]);
}
返回(ret);
}

您可以参考任何现有的jni启动程序代码。您看过了吗?我想添加一条关于在jni中为Java构建complexer数据结构的一般警告。如果您在jni代码中没有正确地手工完成预期的操作,这可能会使您陷入困境。举个例子:链接列表有一些严重的缺陷:调用
NewObjectArray
后,应该检查是否发生了
ExceptionOccured
。创建新字符串对象也是如此。当然,有时没有办法做到这一点,但在这种情况下,请记住,您正在雷区中移动。感谢您的回复。如果displayarray已被激活,则此代码有效吗位于java层的内存。该示例仅讨论从JNI返回新构造的字符串数组。JNIEXPORT jboolean JNICALL java_***(JNIEnv*env,jobject obj,jobjectArray displayArray){int stringCount=(env)->GetArrayLength(displayArray);for(int i=0;iGetObjectArrayElement(displayArray,i);jstring tempString=(env)->NewStringUTF(“Hello”);string=tempString;free(tempString);}return false;}有关在JNI代码中释放java字符串的正确方法,请参阅。(简而言之,JNI机制可能会为字符串分配额外的内存,必须显式释放).@raviraj字符串在Java中被假定为不可变的。因此您必须创建新字符串。如果数组已经预先分配,您可以跳过
NewObjectArray
部分,将对数组的引用传递给函数。或者我误解了您的问题?@junix字符串数组已经预先分配,但数据没有填充。我希望较低的层适当地填充数组。这就是目的。如果字符串是不可变的,则语句string=tempString是否正确??
#include <jni.h>
#include "ArrayHandler.h"

JNIEXPORT jobjectArray JNICALL Java_ArrayHandler_returnArray
  (JNIEnv *env, jobject jobj)
{
    jobjectArray ret;
    int i;

    char *message[5]= {"first",
                       "second",
                       "third",
                       "fourth",
                       "fifth"};

    ret= (jobjectArray)env->NewObjectArray(5,
                                           env->FindClass("java/lang/String"),
                                           env->NewStringUTF(""));

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

    return(ret);
}