前端时间学习了Android的jni接口,一直很好奇windows上是否也有这种东西,百度了一番,果然,但是windows上动态链接库的后缀名为.dll,在linux上为.so。windows上调用dll的方法有很多种,通过jni调用是最原始的方法,也是最灵活的方法,但是就是麻烦。
这个想法想了很久,但是就是没时间去搞,趁着最近公司没有什么项目做,比较有空,就拿出来搞一搞。废话不多说,进入正题。
方法一:(通过命令进行编译)
1.新建一个java文件。编写java代码,文件名为:HelloWorld.java
代码如下:
public class HelloWorld
{
static{
System.loadLibrary("HelloWorldDll");
}
public native static int MyMethod();
public static void main(String[] args){
HelloWorld hw = new HelloWorld();
hw.MyMethod();
}
}
2.
编译
java
代码,生成
class文件。
在命令行下输入:javac HelloWorld.java
编译成功后,在同目录下会生成HelloWorld.class文件。
ps:编译时要将dos目录切换至当前目录。
3.根据class文件生成HelloWorld.h,以供C++调用。
在命令行下输入:javah HelloWorld
编译成功后,在同目录下会生成HelloWorld.h文件。
生成代码文件如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: MyMethod
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_HelloWorld_MyMethod
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
ps:切记,如果第一步编写java代码时java文件带了包名,需要连同包名一起写进去。例如:javah com.biidi.nativemethod.HelloWorld。
到这里已经到达一段落了,接下来使用vc6.0创建DLL工程。
4.使用VC++创建dll程序。文件名:HelloWorldDll.dll
首先打开vc点击新建工程,过程如下图:
这里如果是准备使用C代码编写的选择“一个空的DLL工程”,如果使用C++代码编写的选择“一个简单的DLL工程”,我这里选择的是第一个。
工程建立完后如下:
新建一个.c文件
编写.c文件中的代码,编译。代码如下:
#include <stdio.h>
#include <jni.h>
#include "HelloWorld.h"
JNIEXPORT jint JNICALL Java_HelloWorld_MyMethod (JNIEnv *env, jclass thiz)
{
printf("this is helloworld printed in dll");
return 1;
}
ps:1.首先需要将第三步编译出来的HelloWorld.h拷贝到C工程目录下;
2.需要将jni.h和jni_md.h头文件拷贝到vc的头函数库里,或者拷贝到工程目录下,放置于工程目录下需要将include时<>修改为“”。
出错举例:
错误1:fatal error C1083: Cannot open include file: 'HelloWorld.h': No such file or directory
原因:没有把D盘下的HelloWorld.h拷贝到工程目录下面。
错误2:fatal error C1083: Cannot open include file: 'jni.h': No such file or directory
原因:没有把jni.h拷贝到工程目录下。Jin.h的位置:C:\Program Files\Java\jdk1.5.0_06\include
错误3:fatal error C1083: Cannot open include file: 'jni.h': No such file or directory
原因:为什么我已经把jni.h拷贝到工程目录下了,还是会报这个错误呢?那是因为HelloWorld.h里面的#include <jni.h>忘了改成#include “jni.h”。
错误4:fatal error C1083: Cannot open include file: 'jni_md.h': No such file or directory
原因:又是找不到.h。这个jni_md.h藏在C:\Program Files\Java\jdk1.5.0_06\include\win32下面。
至此,在C工程目录下的Debug已经生成了HelloWorldDll.dll文件。
5.将HelloWorldDll.dll文件拷贝至HelloWorld.class文件同目录下,从命令行执行:Java HelloWorld
看看效果吧:
参考资料:http://www.cnblogs.com/GoAhead/archive/2012/12/09/2809944.html
Deme工程文件,请移步到我的资源下载。
http://download.csdn.net/detail/gjh460293451/8184635