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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-09 01:45:07  来源:igfitidea点击:

jstring return in JNI program

stringjava-native-interfacereturn

提问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()))