gpt4 book ai didi

android - 将 jobjectArray 从 C++ 传递到 Java,返回的字符串未完成

转载 作者:太空狗 更新时间:2023-10-29 13:24:42 31 4
gpt4 key购买 nike

我想通过 JNI 将字符串数组从 C++ 传递给 Java,意味着将 String[] 返回给 java。

当我在 C++ 中打印 char* 时是正确的,但是当我在 Java 中打印 String 时不正确。例如,在 C++ 中,char* 是“AdaptationSet 1”,但在 Java 中有时是“AdaptationSe”,有时是“tring”; (我不知道这是什么)。

我不确定我的代码哪里不对,请给我任何帮助。

这是我的 C++ 代码

jobjectArray getJavaStringArray(JNIEnv *env, char ** array, int size)
{
jobjectArray ret;
int i;

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

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

return ret;
}

extern "C" JNIEXPORT jobjectArray Java_com_example_test_MainActivity_nGetStrings(JNIEnv *env, jobject obj)
{
int i, size = 1;
jobjectArray ret = NULL;
char **array = (char**) calloc(size, sizeof(char*));

for (i = 0; i < size; i++) {
std::stringstream ss;
ss << "AdaptationSet " << i+1;
array[i] = (char*) ss.str().c_str();
}

return getJavaStringArray(env, array, size);
}

Java代码

package com.example.test

import ...;

public class MainActivity extends Activity {
private native String[] nGetStrings();

static {
System.loadLibrary("myLib");
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

String[] arrays = nGetStrings();
for(int i = 0; i < arrays.length; i++) {
System.out.println("arrays[" + i + "] = " + arrays[i]);
}
}
}

解决方案:

问题出在这一行:

array[i] = (char*) ss.str().c_str();

解决方案是复制内容,像这样:

array[i] = (char*) calloc(ss.str().size()+1, sizeof(char));
memcpy(array[i], ss.str().c_str(), ss.str().size());

感谢您的建议。

最佳答案

这里可能有一个问题 array[i] = (char*) ss.str().c_str();
您必须复制字符串内容而不是 C/C++ 中的指针。

试试下面的例子:

#include<iostream>
#include<sstream>
using namespace std;

int main()
{
stringstream ss1,ss2;
char *str1, *str2;
ss1 << "s1";
ss2 << "s2";

str1 = (char*) ss1.str().c_str();
str2 = (char*) ss2.str().c_str();
cout << str1;
cout << str2;
return 0;
}

您将得到输出 s2s2 而不是 s1s2

关于android - 将 jobjectArray 从 C++ 传递到 Java,返回的字符串未完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22746956/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com