乱码解决方案JNI 数据类型转换

  1. #include <jni.h>   
  2. #include "com_test_Test.h"   
  3. #include <stdio.h>   
  4. #include <stdlib.h>   
  5. #include <strings.h>   
  6.   
  7. //获取字符串   
  8. JNIEXPORT void JNICALL Java_com_test_Test_sayHello(JNIEnv * env, jobject obj,   
  9.   jstring s) {   
  10.   
  11.  char * str = (char *) (*env)->GetStringUTFChars(env, s, 0);   
  12.  printf("/n c-string: hello - %s", str);   
  13.   
  14. }   
  15.   
  16. //获取,返回int   
  17. JNIEXPORT jint JNICALL Java_com_test_Test_add(JNIEnv * env, jobject obj,   
  18.   jint a, jint b) {   
  19.  int i = a;   
  20.  int j = b;   
  21.  printf("/n c-int: %d - %d", i, j);   
  22.  char str[256];   
  23.  sprintf(str, "%d", i + j);   
  24.  return (jint) i + j;   
  25. }   
  26.   
  27. //获取,返回float   
  28. JNIEXPORT jfloat JNICALL Java_com_test_Test_getFloat(JNIEnv * env, jobject obj,   
  29.   jfloat f) {   
  30.  float fl = f;   
  31.  printf("/n c-float: %3f", fl);   
  32.   
  33.  fl = 200.555;   
  34.  return (jfloat) fl;   
  35. }   
  36.   
  37. //获取,返回 double   
  38. JNIEXPORT jdouble JNICALL Java_com_test_Test_getDouble(JNIEnv * env,   
  39.   jobject obj, jdouble dou) {   
  40.  double d = dou;   
  41.  printf("/n c-double: %3f", d);   
  42.   
  43.  d = 800.88;   
  44.  return (jdouble) d;   
  45. }   
  46.   
  47. //获取,返回boolean   
  48. JNIEXPORT jboolean JNICALL Java_com_test_Test_getBoolean(JNIEnv * env,   
  49.   jobject obj, jboolean bool) {   
  50.   
  51.  unsigned char b = bool;   
  52.  printf("/n c-boolean: %lu  ", b);   
  53.  if (b) {   
  54.   printf("true");   
  55.  } else {   
  56.   printf("false");   
  57.  }   
  58.   
  59.  b = 1;   
  60.  return (jboolean) b;   
  61. }   
  62.   
  63. //获取,返回 string   
  64. JNIEXPORT jstring JNICALL Java_com_test_Test_getString(JNIEnv * env,   
  65.   jobject obj, jstring s) {   
  66.  char * st = (char *) (*env)->GetStringUTFChars(env, s, 0);   
  67.  printf("/n c-string:  %s", st);   
  68.   
  69.  char * str = "hello wang wu!";   
  70.  jstring rtn;   
  71.  rtn = (*env)->NewStringUTF(env, str);   
  72.  return rtn;   
  73. }   
  74.   
  75. //获取,返回 string []   
  76. JNIEXPORT jobjectArray JNICALL Java_com_test_Test_getStringArray(JNIEnv * env,   
  77.   jobject obj, jobjectArray arr) {   
  78.  int len = (*env)->GetArrayLength(env, arr);   
  79.  printf("/n c-stringArray :");   
  80.  int i = 0;   
  81.  for (i = 0; i < len; i++) {   
  82.   jobject obj = (*env)->GetObjectArrayElement(env, arr, i);   
  83.   jstring str = (jstring) obj;   
  84.   const char * szStr = (*env)->GetStringUTFChars(env, str, 0);   
  85.   printf(" %d-%s ", i, szStr);   
  86.   (*env)->ReleaseStringChars(env, str, szStr);   
  87.  }   
  88.  //-----返回----   
  89.   
  90.  jstring str;   
  91.  jobjectArray args = 0;   
  92.  jsize size = 5;   
  93.  char* sa[] = { "Hello,""world!""zhang""san""yuang" };   
  94.  int j = 0;   
  95.  jclass objClass = (*env)->FindClass(env, "java/lang/String");   
  96.  args = (*env)->NewObjectArray(env, size, objClass, 0);   
  97.  for (j = 0; j < size; j++) {   
  98.   str = (*env)->NewStringUTF(env, sa[j]);   
  99.   (*env)->SetObjectArrayElement(env, args, j, str);   
  100.  }   
  101.  return args;   
  102. }  



下面是Test.java

Java代码 复制代码
  1. package com.test;   
  2.   
  3. public class Test {   
  4.  private native void sayHello(String str);   
  5.   
  6.  private native int add(int a, int b);   
  7.   
  8.  private native float getFloat(float f);   
  9.   
  10.  private native double getDouble(double d);   
  11.   
  12.  private native boolean getBoolean(boolean b);   
  13.   
  14.  private native String getString(String str);   
  15.   
  16.  private native String[] getStringArray(String[] sa);   
  17.   
  18.  static {   
  19.   System.loadLibrary("Test");   
  20.  }   
  21.   
  22.  public static void main(String[] args) {   
  23.   Test test = new Test();   
  24.   test.sayHello("zhang san");   
  25.   System.out.println("int     --> " + test.add(1020));   
  26.   System.out.println("float   --> " + test.getFloat((float20.123));   
  27.   System.out.println("double  --> " + test.getDouble(100.369));   
  28.   System.out.println("boolean --> " + test.getBoolean(true));   
  29.   System.out.println("string  --> " + test.getString("wang Wu"));   
  30.   
  31.   String[] ss = { "hello""-""zhang""san" };   
  32.   Object[] obj = test.getStringArray(ss);   
  33.   System.out.print("string[]-->  ");   
  34.   for (Object object : obj) {   
  35.    System.out.print(object + " ");   
  36.   }   
  37.   
  38.  }   
  39.   
  40. }  
package com.test;

public class Test {
 private native void sayHello(String str);

 private native int add(int a, int b);

 private native float getFloat(float f);

 private native double getDouble(double d);

 private native boolean getBoolean(boolean b);

 private native String getString(String str);

 private native String[] getStringArray(String[] sa);

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

 public static void main(String[] args) {
  Test test = new Test();
  test.sayHello("zhang san");
  System.out.println("int     --> " + test.add(10, 20));
  System.out.println("float   --> " + test.getFloat((float) 20.123));
  System.out.println("double  --> " + test.getDouble(100.369));
  System.out.println("boolean --> " + test.getBoolean(true));
  System.out.println("string  --> " + test.getString("wang Wu"));

  String[] ss = { "hello", "-", "zhang", "san" };
  Object[] obj = test.getStringArray(ss);
  System.out.print("string[]-->  ");
  for (Object object : obj) {
   System.out.print(object + " ");
  }

 }

}




++++++++++++++++++++++++++++++++++++++++++++++++++
上面类型转换没有一个一个去试,应该都是可以的
++++++++++++++++++++++++++++++++++++++++++++++++++



2:JNI 乱码解决方案

顺便再转一个JNI相关的:jni乱码解决方案
http://www.wangchao.net.cn/bbsdetail_57022.html


Java代码:

Java代码 复制代码
  1.   
  2.   /*  
  3.   * javactransfer.java  
  4.   * By dpwu  
  5.   * e-mail:dpwu_js@sina.com.cn  
  6.   */  
  7.   public class javactransfer   
  8.   {   
  9.    public String hypotenuse(String send_buf,String recv_buf,int errno)   
  10.    {   
  11.    return hypotenuse0(send_buf,recv_buf,errno);   
  12.    }   
  13.    private native String hypotenuse0(String send_buf,String recv_buf,int errno);   
  14.    static  
  15.    {   
  16.    System.loadLibrary("javactransfer");//调用dll   
  17.    }   
  18.    public static void main( String[] args )   
  19.    {   
  20.    javactransfer obj= new javactransfer();   
  21.    System.out.println("");   
  22.    System.out.println("");   
  23.    System.out.println(" begin!");   
  24.    System.out.println("");   
  25.    System.out.println("");   
  26.    String javasend="发送中文chinese!";   
  27.    System.out.println(" java send:"+"["+javasend+"]");   
  28.   String javarecv=obj.hypotenuse("teststr",javasend,1);   
  29.   //javasend传含有中文字符串给C   
  30.   //javarecv接受C含有中的文字符串   
  31.    System.out.println(" java recv:"+"["+javarecv+"]");   
  32.    System.out.println("");   
  33.    System.out.println("");   
  34.    System.out.println(" end!");   
  35.    }   
  36.   }  
  /*
  * javactransfer.java
  * By dpwu
  * e-mail:dpwu_js@sina.com.cn
  */
  public class javactransfer
  {
   public String hypotenuse(String send_buf,String recv_buf,int errno)
   {
   return hypotenuse0(send_buf,recv_buf,errno);
   }
   private native String hypotenuse0(String send_buf,String recv_buf,int errno);
   static
   {
   System.loadLibrary("javactransfer");//调用dll
   }
   public static void main( String[] args )
   {
   javactransfer obj= new javactransfer();
   System.out.println("");
   System.out.println("");
   System.out.println(" begin!");
   System.out.println("");
   System.out.println("");
   String javasend="发送中文chinese!";
   System.out.println(" java send:"+"["+javasend+"]");
  String javarecv=obj.hypotenuse("teststr",javasend,1);
  //javasend传含有中文字符串给C
  //javarecv接受C含有中的文字符串
   System.out.println(" java recv:"+"["+javarecv+"]");
   System.out.println("");
   System.out.println("");
   System.out.println(" end!");
   }
  }



C实现代码为:

C代码 复制代码
  1. /*  
  2.   * javactransfer.c  
  3.   * By dpwu  
  4.   * e-mail:dpwu_js@sina.com.cn  
  5.   */  
  6.   #include <windows.h>   
  7.   #include "javactransfer.h"//通过javah –jni javactransfer 生成   
  8.   #include <stdio.h>   
  9.   #include "stdlib.h"  
  10.   #include "string.h"  
  11.   char* jstringToWindows( JNIEnv *env, jstring jstr );   
  12.   jstring WindowsTojstring( JNIEnv* env, char* str );   
  13.   JNIEXPORT jstring JNICALL   
  14.   Java_javactransfer_hypotenuse0(JNIEnv *env,jobject obj,jstring send_buf,jstring recv_buf,jint errno)   
  15.   {   
  16.    char * Buf_Return;   
  17.    Buf_Return = (char*)malloc(1024);   
  18.      
  19.    const char * recvtest = jstringToWindows( env, recv_buf );   
  20.   /*上句recvtest接收Java传过来的中文字符串正确,如果改为下句,则出现乱码:  
  21.   const char * recvtest = (*env)->GetStringUTFChars( env,recv_buf,0);  
  22.   */  
  23.   printf( " c recv :[%s]/n" , recvtest);   
  24.      
  25.    sprintf(Buf_Return,"接收中文chinese!");   
  26.    printf( "/n/n/n c send :[%s]/n" , Buf_Return);   
  27.    recv_buf = WindowsTojstring(env ,Buf_Return);   
  28.   /*上句recv_buf传windows本地C中含有中文字符串给Java正确;如果改为下句出现乱码:  
  29.   recv_buf = (*env)->NewStringUTF( env, Buf_Return );  
  30.    */  
  31.    return recv_buf;   
  32.   }   
  33.   char* jstringToWindows( JNIEnv *env, jstring jstr )   
  34.   {   
  35.    int length = (*env)->GetStringLength(env,jstr );   
  36.    const jchar* jcstr = (*env)->GetStringChars(env,jstr, 0 );   
  37.    char* rtn = (char*)malloc( length*2+1 );   
  38.    int size = 0;   
  39.    size = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)jcstr, length, rtn,(length*2+1), NULL, NULL );   
  40.    if( size <= 0 )   
  41.    return NULL;   
  42.    (*env)->ReleaseStringChars(env,jstr, jcstr );   
  43.    rtn[size] = 0;   
  44.    return rtn;   
  45.   }   
  46.   jstring WindowsTojstring( JNIEnv* env, char* str )   
  47.   {   
  48.    jstring rtn = 0;   
  49.    int slen = strlen(str);   
  50.    unsigned short* buffer = 0;   
  51.    if( slen == 0 )   
  52.    rtn = (*env)->NewStringUTF(env,str );   
  53.    else  
  54.    {   
  55.    int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL, 0 );   
  56.    buffer = malloc( length*2 + 1 );   
  57.    if( MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer, length ) >0 )   
  58.    rtn = (*env)->NewString( env, (jchar*)buffer, length );   
  59.    }   
  60.    if( buffer )   
  61.    free( buffer );   
  62.    return rtn;   
  63.   }  




C++实现代码为:

C++代码 复制代码
  1.   
  2.   /*  
  3.   * javactransfer.cpp  
  4.   * By dpwu  
  5.   * e-mail:dpwu_js@sina.com.cn  
  6.   */  
  7.   #include <windows.h>   
  8.   #include "javactransfer.h"//通过javah –jni javactransfer 生成   
  9.   #include <stdio.h>   
  10.   #include "stdlib.h"  
  11.   #include "string.h"  
  12.   char* jstringToWindows( JNIEnv *env, jstring jstr );   
  13.   jstring WindowsTojstring( JNIEnv* env, char* str );   
  14.   JNIEXPORT jstring JNICALL   
  15.   Java_javactransfer_hypotenuse0(JNIEnv *env,jobject obj,jstring send_buf,jstring recv_buf,jint _tperrno)   
  16.   {   
  17.    char * Buf_Return;   
  18.    Buf_Return = (char*)malloc(1024);   
  19.    const char * ctest = jstringToWindows( env, recv_buf );   
  20.   /*  
  21.    如果把上句改为下句,C接收Java字符串时将出现乱码:  
  22.    const char *ctest = (env)->GetStringUTFChars( recv_buf , 0);  
  23.   */  
  24.    printf( " c recv :[%s]/n" , ctest);   
  25.      
  26.    sprintf(Buf_Return,"接收中文chinese!");   
  27.    printf( "/n/n/n c send :[%s]/n" , Buf_Return);   
  28.    recv_buf = WindowsTojstring(env ,Buf_Return);   
  29.   /*上句执行正确,如果把上句换成下句,Java在接收C字符串时出现乱码  
  30.   recv_buf = (env)->NewStringUTF(Buf_Return);  
  31.   */  
  32.    return recv_buf;   
  33.   }   
  34.   char* jstringToWindows( JNIEnv *env, jstring jstr )   
  35.   {   
  36.    int length = (env)->GetStringLength(jstr );   
  37.    const jchar* jcstr = (env)->GetStringChars(jstr, 0 );   
  38.    char* rtn = (char*)malloc( length*2+1 );   
  39.    int size = 0;   
  40.    size = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)jcstr, length, rtn,(length*2+1), NULL, NULL );   
  41.    if( size <= 0 )   
  42.    return NULL;   
  43.    (env)->ReleaseStringChars(jstr, jcstr );   
  44.    rtn[size] = 0;   
  45.    return rtn;   
  46.   }   
  47.   jstring WindowsTojstring( JNIEnv* env, char* str )   
  48.   {   
  49.    jstring rtn = 0;   
  50.    int slen = strlen(str);   
  51.    unsigned short * buffer = 0;   
  52.    if( slen == 0 )   
  53.    rtn = (env)->NewStringUTF(str );   
  54.    else  
  55.    {   
  56.    int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL, 0 );   
  57.    buffer = (unsigned short *)malloc( length*2 + 1 );   
  58.    if( MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer, length ) >0 )   
  59.    rtn = (env)->NewString( (jchar*)buffer, length );   
  60.    }   
  61.    if( buffer )   
  62.    free( buffer );   
  63.    return rtn;   
  64.   }  

 

http://ironurbane.javaeye.com/blog/425513

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值