将字符串从Java传递到JNI

时间:2010-11-22 15:28:47

标签: java java-native-interface

我想将一个字符串传递给我正在编写的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 *?

6 个答案:

答案 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()))