Arrays 如何从C++;(java返回字符串[])? 我知道,我不能调用C++中从java字符串数组返回的方法,所以只有解决方法是将一个数组元素返回到循环调用方法,但是如何将它们存储在C++数组中?

Arrays 如何从C++;(java返回字符串[])? 我知道,我不能调用C++中从java字符串数组返回的方法,所以只有解决方法是将一个数组元素返回到循环调用方法,但是如何将它们存储在C++数组中?,arrays,string,java-native-interface,Arrays,String,Java Native Interface,在Java中,我有一个方法: 公共静态字符串getData(int-index){return arry[index];} 在C++中: char*args[10]; 对于(int i=0;iGetStaticMethodID(INF.cls_JSox,“getData”,(I)Ljava/lang/String;”; jobject result=env->CallStaticObjectMethod(cls、mid、num、i); const char*nativeString=env->

在Java中,我有一个方法:

公共静态字符串getData(int-index){return arry[index];}
在C++中:

char*args[10];
对于(int i=0;iGetStaticMethodID(INF.cls_JSox,“getData”,(I)Ljava/lang/String;”;
jobject result=env->CallStaticObjectMethod(cls、mid、num、i);
const char*nativeString=env->GetStringUTFChars((jstring)结果,0);
const size\u t len=strlen(本地投资);
无法释放StringUTFChars((jstring)结果,nativeString);
}

但是当
i
=1时,我在Java中遇到内存冲突错误。我如何才能将收到的字符串中的数据正确复制到
char*args[10]< java >每个字符串的长度大约为3-5字符,

假设您发布的C++代码段完成,则在获取值之前需要分配<代码> ARGS[i]代码/>代码> -<代码> ARGs[i] =新char [LeN+1 ] < /C> >。

你可以调用一个C++方法,返回一个java字符串数组,假设你的方法是:

public static String[] getData() { return array; }
然后在本机端,您应该能够执行以下操作:

jmethodID method = env->GetStaticMethodID( cls, "getData", "()[Ljava/lang/String;" );
jarray    data   = (jarray) env->CallStaticObjectMethod( cls, method );

// assumption: the result of getData() is never null
jsize const length = env->GetArrayLength( data );

// assumption: the String[] is always of length > 0
char** args = new char*[ length ];

for( jsize index(0); index < length; ++index )
{
    jstring element = (jstring) env->GetObjectArrayElement( data, index );

    // assumption: there are no null strings in the array
    char  const* nativeString = env->GetStringUTFChars( element, 0 );
    jsize const  nativeLength = strlen( nativeString );

    args[index] = new char[ nativeLength + 1 ];
    strncpy( args[index], nativeString, nativeLength );

    env->ReleaseStringUTFChars( element, nativeString );
    env->DeleteLocalRef( element );
}
jmethodide method=env->GetStaticMethodID(cls,“getData”,“()[Ljava/lang/String;”);
jarray数据=(jarray)env->CallStaticObjectMethod(cls,方法);
//假设:getData()的结果从不为空
jsize const length=env->GetArrayLength(数据);
//假设:字符串[]的长度始终大于0
字符**args=新字符*[长度];
用于(jsize索引(0);索引<长度;++索引)
{
jstring元素=(jstring)env->GetObjectArrayElement(数据,索引);
//假设:数组中没有空字符串
char const*nativeString=env->GetStringUTFChars(元素,0);
jsize const nativeLength=strlen(nativeString);
args[index]=新字符[nativeLength+1];
strncpy(args[index],nativeString,nativeLength);
环境->释放StringUTFChars(元素,本地投资);
env->DeleteLocalRef(元素);
}

我没有尝试编译上面的代码段,因此可能会出现一两个错误,但这应该是一个好的起点。我使用char*数组和本机字符串保留了代码,因此在某个时候代码将不得不调用
delete[]
在数组的每个成员和数组本身上。使用
std::vector
std::string
进行内存管理最终可能会更简单,这取决于所提供的字符串的使用方式。

使用JNI调用返回字符串数组的Java方法是绝对可能的。INF.cls_JSox在GetStaticMethodID'是否引用与CallStaticObjectMethod中的'cls'相同的类?