JNI开发入门

JNI开发入门

一、概述

JNI(java native interface),JAVA本地接口调用,目的是为了JAVA可以调用本地程序,主要优点有:
  • 提高效率,解决性能问题
  • 防止反编译,提高核心代码安全性
  • 增强本机接口调用
  • 嵌入式开发应用
如下通过一个最简单的小demo,演示如何进行jni开发。
二、demo演示
1. 新建JAVA文件
新建一个java类,如下:
  1. packagechb.test.jni;
  2. publicclassHelloJni{
  3. publicnativevoidsayHello();
  4. static{
  5. System.loadLibrary("hellojni");
  6. }
  7. publicstaticvoidmain(String[]args){
  8. newHelloJni().sayHello();
  9. }
  10. }
HelloJni.java在硬盘上的位置: D:/workspace/MyWork/src/chb/test/jni/HelloJni.java
2. 生成class文件
1) 利用javac命令进行编译,进入D:/workspace/MyWork/src/chb/test/jni目录,利用
  1. javacHelloJni.java
2) 利用IDE,例如我利用eclipse开发,自动编译,编译后的文件位于:D:/workspace/MyWork/bin/chb/test/jni目录下
3. 生成C头文件
1) 如果利用javac命令编译,则进入D:/workspace/MyWork/src目录,然后输入
  1. javah-jnichb.test.jni.HelloJni
会在D:/workspace/MyWork/src目录下发现新生成的头文件: chb_test_jni_HelloJni.h, 文件内容如下:
  1. /*DONOTEDITTHISFILE-itismachinegenerated*/
  2. #include<jni.h>
  3. /*Headerforclasschb_test_jni_HelloJni*/
  4. #ifndef_Included_chb_test_jni_HelloJni
  5. #define_Included_chb_test_jni_HelloJni
  6. #ifdef__cplusplus
  7. extern"C"{
  8. #endif
  9. /*
  10. *Class:chb_test_jni_HelloJni
  11. *Method:displayHelloJni
  12. *Signature:()V
  13. */
  14. JNIEXPORTvoidJNICALLJava_chb_test_jni_HelloJni_displayHelloJni
  15. (JNIEnv*,jobject);
  16. #ifdef__cplusplus
  17. }
  18. #endif
  19. #endif
2) 如果利用IDE编译,则直接在编译根目录使用javah命令即可,例如进入:D:/workspace/MyWork/bin,然后使用
  1. javah-jnichb.test.jni.HelloJni
效果相同。
注意 :因为HelloJni是在chb.test.jni包中的,因此需要写明全路径,否则如果直接到目录:D:/workspace/MyWork/bin/chb/test/jni,然后执行javah HelloJni,会报出异常,如下:
  1. D:/workspace/ctcc/MyWork/src/chb/test/jni>javahHelloJni
  2. 错误:无法访问HelloJni
  3. 错误的类文件:./HelloJni.class
  4. 类文件包含错误的类:chb.test.jni.HelloJni
  5. 请删除该文件或确保该文件位于正确的类路径子目录中。
  6. com.sun.tools.javac.util.Abort
  7. atcom.sun.tools.javac.comp.Check.completionError(Check.java:164)
  8. atcom.sun.tools.javadoc.DocEnv.loadClass(DocEnv.java:149)
  9. atcom.sun.tools.javadoc.RootDocImpl.<init>(RootDocImpl.java:77)
  10. atcom.sun.tools.javadoc.JavadocTool.getRootDocImpl(JavadocTool.java:159
  11. )
  12. atcom.sun.tools.javadoc.Start.parseAndExecute(Start.java:330)
  13. atcom.sun.tools.javadoc.Start.begin(Start.java:128)
  14. atcom.sun.tools.javadoc.Main.execute(Main.java:66)
  15. atcom.sun.tools.javah.Main.main(Main.java:147)
  16. javadoc:错误-致命错误
  17. 2错误
4. 新建C实现,并生成dll文件
新建c工程,本人利用dev c++,源代码如下:
  1. #include<windows.h>
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<jni.h>
  5. #include"HelloJni.h"
  6. JNIEXPORTvoidJNICALLJava_chb_test_jni_HelloJni_sayHello(JNIEnv*a,jobjectb)
  7. {
  8. printf("helloJni!/n");
  9. return;
  10. }
方法很简单,就输出一句话,然后编译工程,生成hellojni.dll,并且将hellojni.dll拷贝到windows/system32目录下
5. 执行java代码
运行HelloJni的main方法,输出"hello Jni",运行成功
本文比较简单,主要方便大家上手做第一个demo,有个感性的认识。
来自:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值