您的位置:首页 > 移动开发 > Android开发

Android - 从JNI中传入UTF8的字符到Java

2010-03-26 08:01 295 查看
由于env->NewStringUTF支持的是Modified UTF-8,所以这个API不能用来从JNI

中传入标准的UTF8字符到Java。

 

我们有两种解决方法:

 

Java代码

ReturnUTF8.java

public class ReturnUTF8 {

static {
System.loadLibrary("ReturnUTF8Jni");
}

public static native byte[] method1();

public static native Object method2();

public static void main(String[] args) {
try {
byte[] buffer = ReturnUTF8.method1();
String s1 = new String(buffer, "UTF-8");
System.out.println("s1 = " + s1);

String s2 = ReturnUTF8.method2().toString();
System.out.println("s2 = " + s2);
} catch (java.io.UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}


 

# javac ReturnUTF8.java

# javah ReturnUTF8

   -> 这里会生成一个ReturnUTF8.h头文件

 

C++代码

ReturnUTF8.cpp

#include "ReturnUTF8.h"

JNIEXPORT jbyteArray JNICALL Java_ReturnUTF8_method1
(JNIEnv *env, jclass cls)
{
jbyte buffer[] = /*  UTF8 encoding buffer */
jbyteArray bytes = env->NewByteArray(sizeof(buffer));
env->SetByteArrayRegion(bytes, 0, sizeof(buffer), buffer);

return bytes;
}

JNIEXPORT jbyteArray JNICALL Java_ReturnUTF8_method2
(JNIEnv *env, jclass cls)
{
jbyte buffer[] = /*  UTF8 encoding buffer */
jbyteArray bytes = env->NewByteArray(sizeof(buffer));
env->SetByteArrayRegion(bytes, 0, sizeof(buffer), buffer);

jchar encoding_name[] = { 'U', 'T', 'F', '-', '8', '/0' };
jstring encoding = env->NewString(encoding_name, 5);

jclass theStringClass = env->FindClass("java/lang/String");
jmethodID mid = env->GetMethodID(theStringClass, "<init>", "([BLjava/lang/String;)V");

jobject result = env->NewObject(theStringClass, mid, bytes, encoding);

return result;
}


 

# g++ -shared -I /usr/lib/jvm/java-1.5.0-sun/include -I /usr/lib/jvm/java-1.5.0-sun/include/linux ReturnUTF8.cpp -o libReturnUTF8Jni.so

# export LD_LIBRARY=.

# java ReturnUTF8

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息