我想将一个字符串传递给我正在编写的JNI,它必须分配给一个const char *。 以下提到我是如何做到的:
JNI...(...,jstring jstr...){
const char* str = env->GetStringUTFChars(jstr,0);
env->ReleaseStringUTFChars(str,jstr,0);
}
但是如果我在分配给jstring后打印const char * str,那么与我直接在JNI和printf中指定str值时相比,我看到的是不同的。
这是正确的方法吗?或者是否有任何其他方法可以将字符串从java分配给JNI中的const char *?
答案 0 :(得分:30)
java代码
public static native double myMethod( String path);
C代码
JNIEXPORT jdouble JNICALL Java_your_package_structure_className_myMethod
(JNIEnv * env, jobject jobj, jstring path) {
char * path;
path = (*env)->GetStringUTFChars( env, path , NULL ) ;
答案 1 :(得分:2)
你所做的一切都是正确的。 还有其他方法,但获取wchar_t而不是char:
const wchar_t * utf16 = (wchar_t *)env->GetStringChars(bytes, NULL);
size_t length = (size_t)env->GetStringLength(bytes);
...
env->ReleaseStringChars(bytes, (jchar *)utf16);
答案 2 :(得分:0)
实际上,解决方案很简单:“GetStringUTFChars”的最后一个参数是JNI_TRUE来发送副本。由于您传递JNI_FALSE(0)并调用“ReleaseStringUTFChars”,因此您正在销毁引用。 “释放”后看到的是来自应用程序内存中其他位置的随机字节。
使用JNI_TRUE调用“GetStringUTFChars”或删除“ReleaseStringUTFChars”调用将解决您的问题。
编辑:对于墓地挖掘感到抱歉。答案 3 :(得分:0)
#Jigar解释说:
JNIEXPORT jdouble JNICALL Java_your_package_structure_className_myMethod
(JNIEnv * env, jobject jobj, jstring jstr) {
const char *path = (*env)->GetStringUTFChars( env, jstr , NULL ) ;
为了从java获取jstring,应该编写c ++方法,如下所示
C ++代码:
const char *path = env->GetStringUTFChars(jstr , NULL ) ;
更新: 正如评论中所提到的,代码中存在错误。它现在已经修好了。
答案 4 :(得分:0)
JNIEXPORT jstring JNICALL Java_Hello_sayHi(JNIEnv *env, jobject obj, jstring string) {
const char *str = env->GetStringUTFChars(string, 0);
printf("%s", str);
}
答案 5 :(得分:0)
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.
C++ side:
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:
String((array), Charset.defaultCharset()))