JNI程序中的jstring返回
Posted
技术标签:
【中文标题】JNI程序中的jstring返回【英文标题】:jstring return in JNI program 【发布时间】:2012-11-27 14:53:36 【问题描述】:这是 JNI 代码。
Java 代码:
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);
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;
运行我的 java 代码时。我得到了下面的结果。
stringMethod: world
但是我在字符串“world”后面加上了“Hello”。我也在这里返回附加的字符串。但是为什么我只得到“世界”而不是“Hello World”。真的我对这段代码感到困惑。我应该怎么做才能得到附加字符串的结果?
【问题讨论】:
问题出在其他地方,您的串联完全有效:codepad.org/WWR4LzfV 【参考方案1】: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;
【讨论】:
嗯,我看到你的代码和作者的代码之间的唯一区别是他对 JNI 使用 C++ 语法,而你对 JNI 使用 C 语法...... 应该(*env)->NewStringUTF(...)
是env->NewStringUTF(...)
?
@nn0p 在c中使用env
函数时,语句为(*env)->Function(env, parameters)
。然而在 c++ 中,这变成:env->Function(parameters)
.【参考方案2】:
有几种方法,但最好的方法是将const char *
转换为 c++ 字符串,然后转换为 jbyteArray
,并且在 java 端将 byteArray 转换为 UTF-8 很容易。
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 方面:
String((array), Charset.defaultCharset()))
【讨论】:
以上是关于JNI程序中的jstring返回的主要内容,如果未能解决你的问题,请参考以下文章