上次玩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);
}
}

633

被折叠的 条评论
为什么被折叠?



