由于env->NewStringUTF支持的是 Modified UTF-8,所以这个API不能用来从JNI
中传入标准的UTF8字符到Java。
我们有两种解决方法:
Java代码
ReturnUTF8.java
view plaincopy to clipboardprint?
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();
}
}
}
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
view plaincopy to clipboardprint?
#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', '' };
jstring encoding = env->NewString(encoding_name, 5);
jclass theStringClass = env->FindClass("Ljava/lang/String;");
jmethodID mid = env->GetMethodID(theStringClass, "", "([BLjava/lang/String;)V");
jobject result = env->NewObject(theStringClass, mid, bytes, encoding);
return result;
}
#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', '' };
jstring encoding = env->NewString(encoding_name, 5);
jclass theStringClass = env->FindClass("Ljava/lang/String;");
jmethodID mid = env->GetMethodID(theStringClass, "",
"([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
分享到:
相关推荐
android jni 中文字符传递demo,实现了C语言与java端之间互相传递汉字的功能。例程开发环境为eclipse。详细说明,见相关博客。
android JNI C 调用Java
Android JNI中C++层与Java层的对象交互实例代码详细介绍。Android JNI中C++层与Java层的对象交互实例代码详细介绍。Android JNI中C++层与Java层的对象交互实例代码详细介绍。Android JNI中C++层与Java层的对象交互...
world 文档,描述了Android g1环境,C、Java、JNI调用(C调Java、Java调C)基本运算、方法调用、字符串连接的效率测试结果。
Android-JNI完整工程,实现c调用java和java调用c
JNI开发Java和C/C++互相传递List集合, 可以参考: Java从C/C++获取List集合对象:https://blog.csdn.net/niuba123456/article/details/80994166 Java传递List集合对象到C/C++ ...
通过JNI接口静态注册的native方法去创建线程,同时提供native回调Java的方法。通过这个框架可以去实现线程监听某一个状态,然后回调Java的方法(如发消息去通知顶层,实现显示)
研究了很久,也看了Qt on Android,试了很多例子,都不能用(很可能是Qt和Android更新换代太快,很多旧的东西不能用了,所以做了这个例子。
Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例
文档里描述了如何通过jni方法在java与c++代码之间传递非基本类型数据
这是一个简单的JNI开发中C层调用Java层函数的事例工程,对应的博客地址是:http://blog.csdn.net/hty1053240123/article/details/52126386
例子中包含Android 应用程序和JNI的程序,实现充JNI到java层的回调
Android中实现JNI的AES加解密源代码,绝对可以运行!
Android使用JNI调用Python so解释器
android通过JNI访问硬件LED,包含应用程序APP,JNI代码,和LED驱动程序。
android中jni的简单使用示例代码
jni封装串口通讯例子源码,在jni层封装rs232,在android用java调用实现控制 串口发送和接收数据
教你如何生成.h文件,使用window通过NDK编译出.so文件,如何通过JNI调用so文件
Android 开发中JNI的使用总结, JNI是Java Native Interface 的缩写,意为java本地接口, 使用JNI技术可以使得java语言与其它开发语言(如 C、C++ 和汇编语言)编写的应用程序或库进行相互操作。Android系统中的JNI运行...
Android串口JNI代码,亲自验证,可以进行数据收发。