javajni调用的完全手册内容摘要:

seStringUTFChars(s, str)。 } The Java JNI wrapper would be class JavaHowTo { public native void sayHello()。 static { (javahowto)。 } } And finally, to use it public class JNIJavaHowTo { public static void main(String[] args) { JavaHowTo jht = new JavaHowTo()。 ()。 } } Java:JNI 调用资料整理 WSY 2020115 更新 Java和 C互操作的异常问题处理 Java 中需要调用 C 代码, C 代码中反过来又会操作 Java 中的对象,这就需要在 C 代码中处理 Java操作可能出现的异常。 如果不进行处理,一旦发生异常, C 代码部分就会直接退出,同时抛给调用它的 Java代码一个莫名其妙的错误(可能是一个没有任何意义的 Exception)直接看这个错误是无法分析真正的错误原因的。 所以 C 代码中必须要处理这些异常,要么将其抛出,要么忽略掉。 下面是专用的 JNI 函数,可以对异常进行处理。 Throw():丢弃一个现有的异常对象;在固有方法中用于重新丢弃一个异常。 ThrowNew():生成一个新的异常对象,并将其丢弃。 ExceptionOccurred():判断一个异常是否已被丢弃,但尚未清除。 ExceptionDescribe():打印一个异常和堆栈跟踪信息。 ExceptionClear():清除一个待决的异常。 FatalError():造成一个严重错误,不返回。 在所有这些函数中,最不能忽视的就是 ExceptionOccurred()和 ExceptionClear()。 大多数 JNI 函数都能产生异常,而且没有象在 Java 的 try 块内的那种语言特性可供利用。 所以在每一次 JNI 函数调用之后,都必须调用 ExceptionOccurred(),了解异常是否已被丢弃。 若侦测到一个异常,可选择对其加以控制(可能时还要重新丢弃它)。 然而,必须确保异常最终被清除。 这可以在自己的函数中用ExceptionClear()来实现;若 异常被重新丢弃,也可能在其他某些函数中进行。 举个最简单的例子,如果调用 Java 中的方法后出现异常,忽略。 jobject objectAttr = (*env)CallObjectMethod(env, objectDocument, createAttributeMid, stoJstring(env, ABC))。 // deal with exception exc = (*env)ExceptionOccurred(env)。 if(exc) { (*env)ExceptionClear(env)。 doSomething()。 } Java与 C\C++之间通过 JNI传递中文字符串 Java 与 C 之间通过 JNI 传递中文字符串 简介 本文提供一个具体的实例 ,说明 Java 和 C 之间通过 JNI 传递含有中文字符串的参数 ,解决中文乱码问题(双字节或多字节乱码)。 本文给出具体的源代码,对源代码进行了解释, C 部分提供了 C 和 C++两种方式实现的完整代码。 并且所有代码均在实验环境下测试通过。 本文读者须对 Java 和 C(或 C++)有一定的基础知识。 Java:JNI 调用资料整理 WSY 2020115 更新 实验环境 Windows XP (或 Windows2020) Microsoft VisualC++ 安装好 j2sdk 后需要设置环境变量 CLASSPATH=.。 C:\\bin。 C:\\lib\。 C:\\lib\。 C:\\lib\htmlc( j2sdk 安装在 c:\ 目录下) 源代码及代码说明 Java 代码: /* * * By dpwu * : */ 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 { (javactransfer)。 //调用 dll } public static void main( String[] args ) { javactransfer obj= new javactransfer()。 ()。 ()。 ( begin!)。 ()。 ()。 String javasend=发送中文 chinese!。 ( java send:+[+javasend+])。 String javarecv=(teststr,javasend,1)。 //javasend 传含有中文字符串给 C //javarecv 接受 C 含有中的文字符串 ( java recv:+[+javarecv+])。 ()。 ()。 ( end!)。 } Java:JNI 调用资料整理 WSY 2020115 更新 } C 实现代码为: /* * * By dpwu * : */ include include //通过 javah –jni javactransfer 生成 include include include char* jstringToWindows( JNIEnv *env, jstring jstr )。 jstring WindowsTojstring( JNIEnv* env, char* str )。 JNIEXPORT jstring JNICALL Java_javactransfer_hypotenuse0(JNIEnv *env,jobject obj,jstring send_buf,jstring recv_buf,jint errno) { char * Buf_Return。 Buf_Return = (char*)malloc(1024)。 const char * recvtest = jstringToWindows( env, recv_buf )。 /*上句 recvtest 接收 Java 传过来的中文字符串正确 ,如果改为下句 ,则出现乱码 : const char * recvtest = (*env)GetStringUTFChars( env,recv_buf,0)。 */ printf( c recv :[%s]\n , recvtest)。 sprintf(Buf_Return,接收 中文 chinese!)。 printf( \n\n\n c send :[%s]\n , Buf_Return)。 recv_buf = WindowsTojstring(env ,Buf_Return)。 /*上句 recv_buf 传 windows 本地 C 中含有中文字符串给 Java 正确。 如果改为下句出现乱码 : recv_buf = (*env)NewStringUTF( env, Buf_Return )。 */ return recv_buf。 } char* jstringToWindows( JNIEnv *env, jstring jstr ) { int length = (*env)GetStringLength(env,jstr )。 const jchar* jcstr = (*env)GetStringChars(env,jstr, 0 )。 char* rtn = (char*)malloc( length*2+1 )。 Java:JNI 调用资料整理 WSY 2020115 更新 int size = 0。 size = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)jcstr, length, rtn,(length*2+1), NULL, NULL )。 if( size = 0 ) return NULL。 (*env)ReleaseStringChars(env,jstr, jcstr )。 rtn[size] = 0。 return rtn。 } jstring WindowsTojstring( JNIEnv* env, char* str ) { jstring rtn = 0。 int slen = strlen(str)。 unsigned short* buffer = 0。 if( slen == 0 ) rtn = (*env)NewStringUTF(env,str )。 else { int length = 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 )。 return rtn。 } 若 , 均放在 d:\javac 目录下, 然后执行 (此处图片不能上传) javac :编译 java 源代码。 javah –jni javactransfer :生成头文件。 cl Ic:\\include Ic:\\include\win32 LD 通过 Microsoft Visual C++将 C 源代码生成 dll文件,供 java 调用。 执行结果如下: (此处图片不能上传) 执行键入: java javactranfer C++实现代码为 : /* * * By dpwu * : */ Java:JNI 调用资料整理 WSY 2020115 更新 include include //通过 javah –jni javactransfer 生成 include include include char* jstringToWindows( JNIEnv *env, jstring jstr )。 jstring WindowsTojstring( JNIEnv* env, char* str )。 JNIEXPORT jstring JNICALL Java_javactransfer_hypotenuse0(JNIEnv *env,jobject obj,jstring send_buf,jstring recv_buf,jint _tperrno) { char * Buf_Return。 Buf_Return = (char*)malloc(1024)。 const char * ctest = jstringToWindows( env, recv_buf )。 /* 如果把上句改为下句, C 接收 Java 字符串时将出现乱码:。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。