上次玩JNI大概是一年前的事情了,发现现在用还需要查资料,真是好记性赢不了三寸烂笔头,刚好用这个了,记下以后省的找资料了。
一、准备环境
只列出我这次测试用到的环境和工具:
1. jdk
Version: 1.7
2. eclipse
Version: Kepler Service Release 1
Build id: 20130919-0819
3. visual studio 2012
4. ant
Version 1.9.2
想对目前来说都是比较新的版本
二、编写java类
package cn.tang.demos.jni;
public class JNITest {
public native int callMethod(int i,String s1);
}
三、编译和生成.h头文件
1.通过cmd命令生成
2.通过ant 脚本生成
<project name="JNI Builder" default="build" basedir="."> <target name="init" depends="clean"> <property name="project-src" value="${basedir}/src" /> <property name="jni-folder" value="cn/tang/demos/jni" /> </target> <target name="complie" depends="init"> <mkdir dir="build" /> <javac srcdir="${project-src}" destdir="build" debug="true" deprecation="off" encoding="UTF-8"> <include name="${jni-folder}/**/*" /> <exclude name="${jni-folder}/JNITestMain.*" /> <classpath> </classpath> </javac> </target> <target name="build" depends="complie" description="Builds .h header file"> <javah destdir="build" classpath="build" > <class name="cn.tang.demos.jni.JNITest"/> <class name="cn.tang.demos.jni.JNITest2"/> </javah> </target> <target name="clean" description="Removes all generated artifacts"> <delete dir="build" /> </target> </project>
简要说明,源代码文件夹下有三个文件分别是JNITest.java,JNITest2.java,JNITestMain.java ,最后一个文件是main 方法的测试类,所以在编译成class文件的时候被我去掉了,所以最后生成只有两个.h文件。
四、创建dll项目
1.创建一个DLL的项目
2.修改项目设置,最好debug 和release都修改下
3.删除额外的文件
五、根据头文件编码生成dll
1.首先加入头文件依赖的头文件
2. 根据头文件的函数声明实现函数
#include "cn_tang_demos_jni_JNITest.h" #include <stdio.h> JNIEXPORT jint JNICALL Java_cn_tang_demos_jni_JNITest_callMethod (JNIEnv * env, jobject jo, jint ji, jstring js){ printf("jstring is %s",js); return ++ji; }
3. 编译生成dll
build 即可
六、使用dll
package cn.tang.demos.jni;
public class JNITestMain {
public static void main(String[] args) {
System.load("D:\\workspace\\project\\MyTest\\Release\\JNITest.dll");
// System.loadLibrary("JNITest");
int ret=new JNITest().callMethod(19, "hello");
System.out.println("ret is "+ret);
}
}