您的位置:首页 > 编程语言 > Java开发

关于Java调用C写的动态链接库的具体实现方法,自己捉摸了好久,现在算是来造福大众了 T _T

2015-01-21 17:17 429 查看
Java 如何调用C的链接库
这里以我自己写的一个程序为例:

第一步:

首先建立一个标准的java工程,如:sssss,在sssss中新建类aaaa

然后添加代码:

//这里是你想要使用的函数的声明,注:函数名要在这里定义,因为后面要使用这个文件//生成C的头文件,然后再C里面具体实现该方法

public native int ProgrammeStart();
public native int DrawBalesStart();
static{
System.loadLibrary("JavaDLL");//这里JavaDLL是待会要创建的C的DLL名字
}

public
static void
main(String[]
args){
aaaa s = new aaaa();
s.ProgrammeStart();
s.DrawBalesStart();
}

至此Java工程里面的工作已经做完了,接下来我们就要来具体实现C的链接库了。

第二步:

首先找到刚才新建的Java工程将其中的src目录下的.java文件,将其拷贝到桌面上新建的一个文件夹里,如123(也可以直接在该文件夹里操作);

接下来运行cmd中使用cd指令进入到123中,执行javac aaaa.java,则文件夹中生成aaaa.class文件;然后在123中再新建一个文件夹sssss(即java中包的名称)并将class文件放进去,接着执行指令javah
sssss.aaaa,则产生sssss_aaaa.h文件。文件内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class sssss_aaaa */

#ifndef _Included_sssss_aaaa
#define _Included_sssss_aaaa
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: sssss_aaaa
* Method: ProgrammeStart
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_sssss_aaaa_ProgrammeStart
(JNIEnv *, jobject);

/*
* Class: sssss_aaaa
* Method: DrawBalesStart
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_sssss_aaaa_DrawBalesStart
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

至此第二步就全部完成了

第三步:建立VC Win32DLL程序空工程JavaDll(这里的工程名使用上面LoadLibrary(“”)中的名称),不包含任何文件

首先引入第二步生成的sssss_aaaa.h文件(记得把该文件拷贝到本工程目录下),再建立对应的CPP文件,如sssss_aaaa.cpp;

然后,将方法声明拷贝到cpp文件中实现,如:

JNIEXPORT jint JNICALLJava_sssss_aaaa_ProgrammeStart (JNIEnv*, jobject)

{

//具体实现

}

最后编译生成DLL(见Debug文件夹)。

注:编译时可能会提示jni错误,这是因为没有包含jni库的路径,在工具》选项》目录》Include Files 中添加:(这是jni头文件的目录所在根据自己java的安装位置适当修改)

C:\Program Files\Java\jdk1.8.0_25\include\win32

C:\Program Files\Java\jdk1.8.0_25\include

第四部:

将编译好的DLL文件拷贝到Java工程目录下并直接运行即可(即与以下两个文件同目录):

.project

.classpath

总算弄完了,大家做个参考吧!!!!!!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐