Java调用CC++ API 讲解及代码示例.doc_第1页
Java调用CC++ API 讲解及代码示例.doc_第2页
Java调用CC++ API 讲解及代码示例.doc_第3页
Java调用CC++ API 讲解及代码示例.doc_第4页
Java调用CC++ API 讲解及代码示例.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

重庆达渝仁科技官网:我们知道Java是一种平台无关性的语言,平台对于上层的java代码来说是透明的,所以在多数时间我们是不需要调用本地方法,但是假如你遇到了以下情况,你可能就需要使用Java调用本地方法了: 你的Java代码需要得到一个文件的属性。但是你找遍了JDK帮助文档也找不到相关的API。 在本地还有一个别的系统,不过它不是Java语言实现的,这个时候你需要把两套系统整合到一起。 你的Java代码中需要用到某种算法,不过算法是用C实现并封装在动态链接库文件(DLL)当中的。对于上述的三种情况,如果没有JNI的话,那就会变得异常棘手了。JNI其实是Java Native Interface的简称,也就是java本地接口。它提供了若干的API实现了和Java和其他语言的通信(主要是C&C+)。在Java中有一些native方法,这些方法只有方法签名但是没有方法体。其实这些naive方法就是我们说的 java native interface。它提供了一个调用(invoke)的接口,然后用C或者C+去实现。JNI概述JVM封装了各种操作系统实际的差异性的同时,提供了JNI技术,它是一种双向的接口,使得开发者可以通过Java代码调用到各种native的库,反之亦然。所以JNI(Java Native Interface)能作为Java语言的一部分,她能够作为粘合剂将Java应用和其他本地应用(C/C+,Delphi)集合在一起。作为一个双向的接口,JNI能支持两种native代码:native libraries 和native applications。 你能使用JNI去写一些native methods去允许Java Applications能呼叫native libraries中的函数,native methods的具体实现是可能C,C+或者Delphi。 JNI也支持嵌入一个JVM实现到一个本地应用程序中去,去执行那些用Java语言编写的的模块.比如,一个C+编写的浏览器利用内嵌的JVM去执行下载到本地的applet。实现步骤:1) 完成Java代码,编写好Java调用类。2) 编译你的Java类。3) 用javah生成编译好的class文件对应的C/C+ 函数的头文件。4) 实现头文件中的函数原型,编写native代码。5) 将native代码编译打包成DLL库(win32)或共享库(Linux)。6) 将你的Java代码跑起来例子1. 编写Java代码。注意:(1) 调用本地代码的java方法,要设置成native的。(2) 要使用System的LoadLibrary方法去加载包含本地方法实现的库。Java代码: java view plaincopyprint?1. package eric.test; 2.3. public class JNITest 4.5. static 6. System.loadLibrary(JNITest); 7. 8.9. public static native void sayHelloWorld(String msg); 10.11. public static void main(String args) 12. sayHelloWorld(Hello, world); 13. 14. package eric.test;public class JNITest static System.loadLibrary(JNITest);public static native void sayHelloWorld(String msg);public static void main(String args) sayHelloWorld(Hello, world);2. 编译生成的class文件:JNITest.class3. 在命令行下使用javah生成C/C+头文件。在工程的bin目录下输入以下命令:Cmd代码: javah -classpath . -jni eric.test.JNITest javah -classpath . -jni eric.test.JNITest将生成头文件eric_test_JNITest.h,内容如下:Cpp代码: cpp view plaincopyprint?1. /* DO NOT EDIT THIS FILE - it is machine generated */ 2. #include 3. /* Header for class eric_test_JNITest */ 4.5. #ifndef _Included_eric_test_JNITest 6. #define _Included_eric_test_JNITest 7. #ifdef _cplusplus 8. extern C 9. #endif 10. /* 11. * Class: eric_test_JNITest 12. * Method: sayHelloWorld 13. * Signature: (Ljava/lang/String;)V 14. */ 15. JNIEXPORT void JNICALL Java_eric_test_JNITest_sayHelloWorld 16. (JNIEnv *, jclass, jstring); 17.18. #ifdef _cplusplus 19. 20. #endif 21. #endif /* DO NOT EDIT THIS FILE - it is machine generated */#include /* Header for class eric_test_JNITest */#ifndef _Included_eric_test_JNITest#define _Included_eric_test_JNITest#ifdef _cplusplusextern C #endif/* * Class: eric_test_JNITest * Method: sayHelloWorld * Signature: (Ljava/lang/String;)V */JNIEXPORT void JNICALL Java_eric_test_JNITest_sayHelloWorld (JNIEnv *, jclass, jstring);#ifdef _cplusplus#endif#endif注意,在执行javah的时候,要输入完整的包名和类名。否则在以后的测试调用过程中会发生java.lang.UnsatisfiedLinkError这个异常。4. 实现C+代码。在VS2008中创建一个Win32 project,类型为DLL。将刚才生成的头文件eric_test_JNITest.h拷到工程目录下,并且在项目中导入到Header Files里面。打开StdAfx.h文件,在最后面添加:Cpp代码: cpp view plaincopyprint?1. #include jni.h 2. #include eric_test_JNITest.h #include jni.h#include eric_test_JNITest.h打开JNITest.cpp文件,在其中添加实现代码。函数名为头文件中定义的函数声明。Cpp代码: cpp view plaincopyprint?1. #include 2. using namespace std; 3.4. JNIEXPORT void JNICALL Java_eric_test_JNITest_sayHelloWorld 5. (JNIEnv* env, jclass method, jstring param) 6. 7. const char* pt = env-GetStringUTFChars(param, 0); 8. cout pt called by Java Native Interface endl; 9. #include using namespace std;JNIEXPORT void JNICALL Java_eric_test_JNITest_sayHelloWorld (JNIEnv* env, jclass method, jstring param)const char* pt = env-GetStringUTFChars(param, 0); cout pt called by Java Native Interface endl; 其中,GetStringUTFChars是jre中提供的jni方法,用来得到java string的字符串。5. 构建C+项目。会出现Cannot open include file: jni.h: No such file or directory的错误,解决方法是将以下文件拷贝到C+工程目录下 %JAVA_HOME%includejni.h %JAVA_HOME%includewin32jni_md.h同时将头文件eric_test_JNITest.h中的 #include 改为Cpp代码: cpp view plaincopyprint?1. #include jni.h #inclu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论