将字符串从Java传递到JNI
我想将一个字符串传递给我正在写的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 *?
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 ) ;
- 参考
你所做的一切都是正确的。 除了获取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);
实际上,解决方案很简单:“GetStringUTFChars”的最后一个参数是JNI_TRUE来发送副本。 由于您正在传递JNI_FALSE(0)并调用“ReleaseStringUTFChars”,因此您正在销毁引用。 “释放”后看到的是来自应用程序内存中其他位置的随机字节。
使用JNI_TRUE调用“GetStringUTFChars”或删除“ReleaseStringUTFChars”调用将解决您的问题。
编辑:抱歉墓地挖掘。
正如#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 ) ;
更新:如评论中所述,代码中存在错误。 它现在已修复。
JNIEXPORT jstring JNICALL Java_Hello_sayHi(JNIEnv *env, jobject obj, jstring string) { const char *str = env->GetStringUTFChars(string, 0); printf("%s", str); }