JNI将jstring转换为char *


113

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

我如何转换jstringchar *

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


您是否考虑过查阅文档?
罗恩侯爵,

Answers:


227

这是我开始使用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(javaString, 0);

   // use your string

   env->ReleaseStringUTFChars(javaString, nativeString);
}

1
有必要保持nativeString恒定吗?
Prasham

5
如果检查第二个链接,则函数GetStringUTFChars的原型为:const jbyte * GetStringUTFChars(JNIEnv * env,jstring string,jboolean * isCopy); 所以你真的没有一个的choise
贾森·罗杰斯

1
我认为值得一提的是,此处(以及Wikipedia页面上)概述的技术使用了经过修改的UTF-8编码,这种编码可能无法在所有情况下都有效。见developer.android.com/guide/practices/...
cqcallaw

1
谢谢,这项工作,但有趣的是const char *不能转换为char * :)。
CoDe

1
@CoDe从技术上讲,它可以带有一些魔力,但是最好避免;声明它可能const是有原因的。对您的问题的正确答案是strcpyconst char*char*。那应该为您提供所需的可变项char*
Loduwijk

51

首先感谢Jason Rogers的回答。

Android && cpp中应该是这样的:

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

// use your string

env->ReleaseStringUTFChars(javaString, nativeString);

可以解决此错误:

1.错误:“->”的基本操作数具有非指针类型“ JNIEnv {aka _JNIEnv}”

2.错误:没有匹配的函数调用'_JNIEnv :: GetStringUTFChars(JNIEnv *&,_jstring *&,bool)'

3.错误:没有匹配的函数调用'_JNIEnv :: ReleaseStringUTFChars(JNIEnv *&,_jstring *&,char const *&)'

4.添加“ env-> DeleteLocalRef(nativeString);” 最后。


您需要使用(* env)->而不是env->
AlexanderNajafi

2
(*env)->在使用C而不是C ++ 时才需要。
Juneone '18年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.