将字符串从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); }