1:JNI 数据类型转换
下面是 Test.c
- #include<jni.h>
- #include"com_test_Test.h"
- #include<stdio.h>
- #include<stdlib.h>
- #include<strings.h>
- JNIEXPORTvoidJNICALLJava_com_test_Test_sayHello(JNIEnv*env,jobjectobj,
- jstrings){
- char*str=(char*)(*env)->GetStringUTFChars(env,s,0);
- printf("\nc-string:hello-%s",str);
- }
- JNIEXPORTjintJNICALLJava_com_test_Test_add(JNIEnv*env,jobjectobj,
- jinta,jintb){
- inti=a;
- intj=b;
- printf("\nc-int:%d-%d",i,j);
- charstr[256];
- sprintf(str,"%d",i+j);
- return(jint)i+j;
- }
- JNIEXPORTjfloatJNICALLJava_com_test_Test_getFloat(JNIEnv*env,jobjectobj,
- jfloatf){
- floatfl=f;
- printf("\nc-float:%3f",fl);
- fl=200.555;
- return(jfloat)fl;
- }
- JNIEXPORTjdoubleJNICALLJava_com_test_Test_getDouble(JNIEnv*env,
- jobjectobj,jdoubledou){
- doubled=dou;
- printf("\nc-double:%3f",d);
- d=800.88;
- return(jdouble)d;
- }
- JNIEXPORTjbooleanJNICALLJava_com_test_Test_getBoolean(JNIEnv*env,
- jobjectobj,jbooleanbool){
- unsignedcharb=bool;
- printf("\nc-boolean:%lu",b);
- if(b){
- printf("true");
- }else{
- printf("false");
- }
- b=1;
- return(jboolean)b;
- }
- JNIEXPORTjstringJNICALLJava_com_test_Test_getString(JNIEnv*env,
- jobjectobj,jstrings){
- char*st=(char*)(*env)->GetStringUTFChars(env,s,0);
- printf("\nc-string:%s",st);
- char*str="hellowangwu!";
- jstringrtn;
- rtn=(*env)->NewStringUTF(env,str);
- returnrtn;
- }
- JNIEXPORTjobjectArrayJNICALLJava_com_test_Test_getStringArray(JNIEnv*env,
- jobjectobj,jobjectArrayarr){
- intlen=(*env)->GetArrayLength(env,arr);
- printf("\nc-stringArray:");
- inti=0;
- for(i=0;i<len;i++){
- jobjectobj=(*env)->GetObjectArrayElement(env,arr,i);
- jstringstr=(jstring)obj;
- constchar*szStr=(*env)->GetStringUTFChars(env,str,0);
- printf("%d-%s",i,szStr);
- (*env)->ReleaseStringChars(env,str,szStr);
- }
- jstringstr;
- jobjectArrayargs=0;
- jsizesize=5;
- char*sa[]={"Hello,","world!","zhang","san","yuang"};
- intj=0;
- jclassobjClass=(*env)->FindClass(env,"java/lang/String");
- args=(*env)->NewObjectArray(env,size,objClass,0);
- for(j=0;j<size;j++){
- str=(*env)->NewStringUTF(env,sa[j]);
- (*env)->SetObjectArrayElement(env,args,j,str);
- }
- returnargs;
- }
下面是Test.java
- packagecom.test;
- publicclassTest{
- privatenativevoidsayHello(Stringstr);
- privatenativeintadd(inta,intb);
- privatenativefloatgetFloat(floatf);
- privatenativedoublegetDouble(doubled);
- privatenativebooleangetBoolean(booleanb);
- privatenativeStringgetString(Stringstr);
- privatenativeString[]getStringArray(String[]sa);
- static{
- System.loadLibrary("Test");
- }
- publicstaticvoidmain(String[]args){
- Testtest=newTest();
- test.sayHello("zhangsan");
- 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("wangWu"));
- String[]ss={"hello","-","zhang","san"};
- Object[]obj=test.getStringArray(ss);
- System.out.print("string[]-->");
- for(Objectobject:obj){
- System.out.print(object+"");
- }
- }
- }
++++++++++++++++++++++++++++++++++++++++++++++++++
上面类型转换没有一个一个去试,应该都是可以的
++++++++++++++++++++++++++++++++++++++++++++++++++
2:JNI 乱码解决方案
顺便再转一个JNI相关的:jni乱码解决方案
http://www.wangchao.net.cn/bbsdetail_57022.html
Java代码:
- publicclassjavactransfer
- {
- publicStringhypotenuse(Stringsend_buf,Stringrecv_buf,interrno)
- {
- returnhypotenuse0(send_buf,recv_buf,errno);
- }
- privatenativeStringhypotenuse0(Stringsend_buf,Stringrecv_buf,interrno);
- static
- {
- System.loadLibrary("javactransfer");
- }
- publicstaticvoidmain(String[]args)
- {
- javactransferobj=newjavactransfer();
- System.out.println("");
- System.out.println("");
- System.out.println("begin!");
- System.out.println("");
- System.out.println("");
- Stringjavasend="发送中文chinese!";
- System.out.println("javasend:"+"["+javasend+"]");
- Stringjavarecv=obj.hypotenuse("teststr",javasend,1);
- System.out.println("javarecv:"+"["+javarecv+"]");
- System.out.println("");
- System.out.println("");
- System.out.println("end!");
- }
- }
C实现代码为:
- #include<windows.h>
- #include"javactransfer.h"
- #include<stdio.h>
- #include"stdlib.h"
- #include"string.h"
- char*jstringToWindows(JNIEnv*env,jstringjstr);
- jstringWindowsTojstring(JNIEnv*env,char*str);
- JNIEXPORTjstringJNICALL
- Java_javactransfer_hypotenuse0(JNIEnv*env,jobjectobj,jstringsend_buf,jstringrecv_buf,jinterrno)
- {
- char*Buf_Return;
- Buf_Return=(char*)malloc(1024);
-
- constchar*recvtest=jstringToWindows(env,recv_buf);
-
- printf("crecv:[%s]\n",recvtest);
-
- sprintf(Buf_Return,"接收中文chinese!");
- printf("\n\n\ncsend:[%s]\n",Buf_Return);
- recv_buf=WindowsTojstring(env,Buf_Return);
-
- returnrecv_buf;
- }
- char*jstringToWindows(JNIEnv*env,jstringjstr)
- {
- intlength=(*env)->GetStringLength(env,jstr);
- constjchar*jcstr=(*env)->GetStringChars(env,jstr,0);
- char*rtn=(char*)malloc(length*2+1);
- intsize=0;
- size=WideCharToMultiByte(CP_ACP,0,(LPCWSTR)jcstr,length,rtn,(length*2+1),NULL,NULL);
- if(size<=0)
- returnNULL;
- (*env)->ReleaseStringChars(env,jstr,jcstr);
- rtn[size]=0;
- returnrtn;
- }
- jstringWindowsTojstring(JNIEnv*env,char*str)
- {
- jstringrtn=0;
- intslen=strlen(str);
- unsignedshort*buffer=0;
- if(slen==0)
- rtn=(*env)->NewStringUTF(env,str);
- else
- {
- intlength=MultiByteToWideChar(CP_ACP,0,(LPCSTR)str,slen,NULL,0);
- buffer=malloc(length*2+1);
- if(MultiByteToWideChar(CP_ACP,0,(LPCSTR)str,slen,(LPWSTR)buffer,length)>0)
- rtn=(*env)->NewString(env,(jchar*)buffer,length);
- }
- if(buffer)
- free(buffer);
- returnrtn;
- }
C++实现代码为:
- #include<windows.h>
- #include"javactransfer.h"//通过javah–jnijavactransfer生成
- #include<stdio.h>
- #include"stdlib.h"
- #include"string.h"
- char*jstringToWindows(JNIEnv*env,jstringjstr);
- jstringWindowsTojstring(JNIEnv*env,char*str);
- JNIEXPORTjstringJNICALL
- Java_javactransfer_hypotenuse0(JNIEnv*env,jobjectobj,jstringsend_buf,jstringrecv_buf,jint_tperrno)
- {
- char*Buf_Return;
- Buf_Return=(char*)malloc(1024);
- constchar*ctest=jstringToWindows(env,recv_buf);
- printf("crecv:[%s]\n",ctest);
- sprintf(Buf_Return,"接收中文chinese!");
- printf("\n\n\ncsend:[%s]\n",Buf_Return);
- recv_buf=WindowsTojstring(env,Buf_Return);
- returnrecv_buf;
- }
- char*jstringToWindows(JNIEnv*env,jstringjstr)
- {
- intlength=(env)->GetStringLength(jstr);
- constjchar*jcstr=(env)->GetStringChars(jstr,0);
- char*rtn=(char*)malloc(length*2+1);
- intsize=0;
- size=WideCharToMultiByte(CP_ACP,0,(LPCWSTR)jcstr,length,rtn,(length*2+1),NULL,NULL);
- if(size<=0)
- returnNULL;
- (env)->ReleaseStringChars(jstr,jcstr);
- rtn[size]=0;
- returnrtn;
- }
- jstringWindowsTojstring(JNIEnv*env,char*str)
- {
- jstringrtn=0;
- intslen=strlen(str);
- unsignedshort*buffer=0;
- if(slen==0)
- rtn=(env)->NewStringUTF(str);
- else
- {
- intlength=MultiByteToWideChar(CP_ACP,0,(LPCSTR)str,slen,NULL,0);
- buffer=(unsignedshort*)malloc(length*2+1);
- if(MultiByteToWideChar(CP_ACP,0,(LPCSTR)str,slen,(LPWSTR)buffer,length)>0)
- rtn=(env)->NewString((jchar*)buffer,length);
- }
- if(buffer)
- free(buffer);
- returnrtn;
- }
-
分享到:
相关推荐
jni数据类型转换例程 1. java向native传递常用基本数据类型 和字符串类型 2. java向native传递数组类型 3. java向native传递自定义java对象 4. java向native传递任意java对象(以向native传递ArrayList为例) 5....
08_12_JNI_02_jni数据类型&属性方法08_12_JNI_02_jni数据类型&属性方法08_12_JNI_02_jni数据类型&属性方法08_12_JNI_02_jni数据类型&属性方法08_12_JNI_02_jni数据类型&属性方法08_12_JNI_02_jni数据类型&属性方法08...
java jni 与 c++ 数据类型转换 及调用
解决JNI中文乱码,
Java与JNI数据类型对照表,可能有许多不足之处,请大家参考一下。
JNI数据类型.pdf
通过jni 用java调用c/c++ 编译的 dll 动态库 帖子地址 https://blog.csdn.net/qq_38777624/article/details/114625668
JNI数据类型[借鉴].pdf
jsp,java中文乱码问题另类解决方案,jni加密、解密编码
jni基本数据类型,数组及对象的传递demo,此demo可推出c,c++调用java方法的实现原理
JAVAjni,使用JAVA操作INI增删改查文件,UTF-8版,解决中文乱码问题
JNI复杂类型转换
本例演示了最常用的字符、数值、字符数组、数值数组等在free pascal和android虚拟机之间的互相传递。 代码包括这些数据类型转换示例。
一个C++(Ubuntu16.04+QT5.9.1)通过JNI,调用JAVA类及方法的示例。通过JNI传递和返回多种类型的参数,boolean ,int,String,ArrayList,ArrayList嵌套ArrayList<ArrayList<String>>等。
通过jni将一张彩色图片转换为黑白图片,通过这个demo,可以深入了解jni的应用
Android Java代码与JNI交互 引用类型转换(五)
JNI中C和Java参数传递详细例子,各种数据类型,基本类型,数据,结构体,DEMO,非常适合初学者,一看就明,详细例子