由于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

更多相关文章

  1. java &android base64加密解密
  2. Android避免进入一页面后EditText自动弹出软键盘
  3. Android控制双击返回按钮退出程序的代码
  4. 【xml String format】error: Multiple substitutions specified
  5. Android(安卓)NDK开发之旅37--FFmpeg转码压缩
  6. Android:开机自启动并接收推送消息
  7. Android(安卓)self_adaption of screen
  8. 使用Android(安卓)Camera2 API获取YUV数据
  9. sqlite 中判断某个表是否存在的方法

随机推荐

  1. android像素db转px或者px转dp(有案例)
  2. 【Android和iOS】快速切换到主线程更新UI
  3. android列表收缩与展开仿QQ好友列表(非常
  4. android 关于关于Android的nodpi,xhdpi,h
  5. android ADB SHELL常用调试指令
  6. Android进阶之光读书笔记:View体系(一) View
  7. Android线程模型和AsyncTask
  8. Android(安卓)Quick Return Bar导航条
  9. Android的手势检测
  10. 【Android】Android studio jks打包证书