最近想捣鼓下ndk,无奈对jni了解甚少,只好慢慢来了,从hello world开始。
------------------------------------------------------------------------------------------------------------
准备工具:
(由于电脑用的是win系统...)
Dev c++ 5.2.0.3
eclipse
jdk6
开始编写:
java代码编写
public class JniDemo {
static{
System.loadLibrary("firstdll");
}//加载库,该库实现了sayHellow方法
//下面声明native方法sayHellow
public native void sayHello();
public static void main(String[] args) {
new JniDemo().sayHello();
}
}
以上java代码十分简单,声明了一个native方法,并且在加载class的时候就执行System.loadLibrary("firstdll");加载native库
dll文件的命名需要注意一下,如上名为firstdll的库,在win32系统上会去寻找firstdll.dll的文件,如果是linux下的话则是lib
firstdll.so.
显示我现在用的是win系统,那么我们新建一个c++ 的dll工程,名字叫做firstdll.
接下来就可以开始编写c代码了,我们需要用先前写好的java编译好的class文件.进入java工程的bin目录(请确保存在class文件)
在cmd命令行下执行 javah -classpath . -jni cn.my.JniDemo
那么就会生成一个名为cn_my_JniDemo.h的文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class cn_my_JniDemo */
#ifndef _Included_cn_my_JniDemo
#define _Included_cn_my_JniDemo
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: cn_my_JniDemo
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_cn_my_JniDemo_sayHello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
把这个h文件放到先前建好的工程firstdll中
接着就可以include这个h声明,进行代码实现了
接着就可以很开心的生成dll了.....
细心的人一定发现少了什么,是的,cn_my_JniDemo.h中有这么一行:#include <jni.h>
jni.h声明了c中与java对应的类型。
我们需要引入两个h文件,它们位于 F:\jdk1.6\include\jni.h 和 F:\jdk1.6\include\win32\jni_md.h (jdk路径根据实际情况而定)
引入方法1:将两个h文件拷到c工程下,并且把#include <jni.h>修改为 #include "jni.h"
引入方法2:使用工具引入,这里用dev c++引入。
之后就是编译程序.....在项目工程将会出现
将dll放到java工程中,运行测试吧
成功了~~
关于dll的放置位置也需要注意,要直接放到java工程下,不然会找不到dll库的。(本想把它放到lib文件夹中,但发现怎么折腾都不行....重点是学习jni,这些细节日后再纠结吧)
转载注明:http://blog.csdn.net/always4321/article/details/41723087