string JNI程序中的jstring返回
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/13796786/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
jstring return in JNI program
提问by Smith Dwayne
This is JNI code.
这是 JNI 代码。
Java code:
爪哇代码:
public class Sample1 {
public native String stringMethod(String text);
public static void main(String[] args)
{
System.loadLibrary("Sample1");
Sample1 sample = new Sample1();
String text = sample.stringMethod("world");
System.out.println("stringMethod: " + text);
}
}
Cpp Method for stringMethod function:
stringMethod 函数的 Cpp 方法:
JNIEXPORT jstring JNICALL Java_Sample1_stringMethod
(JNIEnv *env, jobject obj, jstring string) {
const char *name = env->GetStringUTFChars(string, NULL);//Java String to C Style string
char msg[60] = "Hello ";
jstring result;
strcat(msg, name);
env->ReleaseStringUTFChars(string, name);
puts(msg);
result = env->NewStringUTF(msg); // C style string to Java String
return result;
}
When running my java code. I got the result below.
运行我的java代码时。我得到了下面的结果。
stringMethod: world
But I appended the string "world" with "Hello ". I'm also returning here the appended string. But why I'm getting only "world" not "Hello World". Really I confused with this code. What should I do to get the result with appended string?
但是我在字符串“world”后面加上了“Hello”。我也在这里返回附加的字符串。但是为什么我只得到“世界”而不是“Hello World”。我真的对这段代码感到困惑。我应该怎么做才能获得附加字符串的结果?
采纳答案by user4302170
this should be the way to do it....
这应该是这样做的方式......
JNIEXPORT jstring JNICALL Java_Sample1_stringMethod
(JNIEnv *env, jobject obj, jstring string) {
const char *name = (*env).GetStringUTFChars(env,string, NULL);
char msg[60] = "Hello ";
jstring result;
strcat(msg, name);
(*env).ReleaseStringUTFChars(env,string, name);
puts(msg);
result = (*env).NewStringUTF(env,msg);
return result;
}
回答by vijaycaimi
There are several ways but the best I got by converting const char *
to c++ string and then to jbyteArray
, and its easy to conversion of byteArray to UTF-8 on java side.
有几种方法,但我得到的最好的方法是先转换const char *
为 c++ 字符串,然后再jbyteArray
转换为,并且在 java 端很容易将 byteArray 转换为 UTF-8。
C++ side:
C++方面:
const char* string = propertyValue;
std::string str = string;
jbyteArray array = env->NewByteArray(str.length());
env->SetByteArrayRegion(array,0,str.length(),(jbyte*)str.c_str());
return array;
Java/kotlin side:
Java/kotlin 方面:
String((array), Charset.defaultCharset()))