I want to pass String array from C++ to Java by JNI, means return String[] to java.
When I print the char* in C++ is correct, but when I print the String in Java is incorrect.
For example, in C++ char* is "AdaptationSet 1", but in Java sometimes is "AdaptationSe" sometimes is "tring;" (I don't know what's this).
I'm not sure where is incorrect in my code, please give me any helps.
This is my C++ code
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;
}
and
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 code
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]);
}
}
}
SOLUTION:
The problem is at this line:
array[i] = (char*) ss.str().c_str();
The solution is copy the content, like this:
array[i] = (char*) calloc(ss.str().size()+1, sizeof(char));
memcpy(array[i], ss.str().c_str(), ss.str().size());
Thanks for your suggestions.