JNI将jstring转换为char*

Pra*_*ham 109 java java-native-interface

jstring通过使用JNI 将URL字符串从Java传递到C代码作为数据类型.我的库方法需要一个char *url.

我如何转换jstringchar *

PS:在C中使用jcharArray有什么好处吗?(即char []在本机方法中传递而不是字符串)

Jas*_*ers 218

这是我在开始使用JNI时发现的一些有用的链接

http://en.wikipedia.org/wiki/Java_Native_Interface
http://download.oracle.com/javase/1.5.0/docs/guide/jni/spec/functions.html

关于你的问题,你可以使用它

JNIEXPORT void JNICALL Java_ClassName_MethodName(JNIEnv *env, jobject obj, jstring javaString)   
{
   const char *nativeString = (*env)->GetStringUTFChars(env, javaString, 0);

   // use your string

   (*env)->ReleaseStringUTFChars(env, javaString, nativeString);
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你检查第二个链接,函数GetStringUTFChars的原型是:const jbyte*GetStringUTFChars(JNIEnv*env,jstring string,jboolean*isCopy); 所以你真的没有选择 (5认同)
  • 我认为值得注意的是,此处(以及维基百科页面上)概述的技术使用修改后的 UTF-8 编码,这可能不适用于所有情况。见 http://developer.android.com/guide/practices/jni.html#UTF_8_and_UTF_16_strings (2认同)
  • 谢谢,这项工作但有趣的是 const char* 不能转换为 char* :)。 (2认同)

kan*_*ear 48

首先感谢Jason Rogers的回答.

Android && cpp应该是这样的:

const char *nativeString = env->GetStringUTFChars(javaString, nullptr);

// use your string

env->ReleaseStringUTFChars(javaString, nativeString);
Run Code Online (Sandbox Code Playgroud)

可以修复此错误:

1.error:' - >'的基本操作数有非指针类型'JNIEnv {aka _JNIEnv}'

2.error:没有匹配函数来调用'_JNIEnv :: GetStringUTFChars(JNIEnv*&,_ jstring*&,bool)'

3.error:没有匹配函数来调用'_JNIEnv :: ReleaseStringUTFChars(JNIEnv*&,_ jstring*&,char const*&)'

4.add"env-> DeleteLocalRef(nativeString);" 最后.

  • 如果您使用的是 C,则只需要 `(*env)->`,而不是 C++。 (2认同)