关于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
总算弄完了,大家做个参考吧!!!!!!!!!
这里以我自己写的一个程序为例:
第一步:
首先建立一个标准的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
总算弄完了,大家做个参考吧!!!!!!!!!
相关文章推荐
- JAVA实现动态加载jar包并调用其中的方法
- dll动态链接库之用类写配置文件和调用判断方法接口的实现中遇到的若干问题
- Java使用注解和动态代理实现方法调用时的日志记录示例
- 关于Java中Scanner对象的hasNext()方法对实现Readable接口的对象中的read()方法调用的探讨
- java 解决调用c语言实现简单HelloWorld函数生成.dll动态链接库的32位dll文件无法在64位机上运行
- 通过DLL路径,实现动态调用动态链接库中指定类的(静态)方法和属性
- java中字符串处理、串联和转换的几个常用方法,以及如果需要自己编程实现的具体实施步骤。
- 具体mongo 中关于java的各个接口实现方法。
- Java调用C++动态库具体实现
- java方法调用之动态调用多态(重写override)的实现原理——方法表(三)
- [置顶] 关于JAVA动态加载类[简单IOC的实现] -- vb2005xu自己动手
- 关于Java中Scanner对象的hasNext()方法对实现Readable接口的对象中的read()方法调用的探讨
- java方法调用之动态调用多态(重写override)的实现原理——方法表(三)
- java web JNative调用dll动态链接库:和注意方法
- 关于Java中Scanner对象的hasNext()方法对实现Readable接口的对象中的read()方法调用的探讨
- C语言调用MATLAB生成的动态链接库的具体方法
- 用Annotation,Future,动态代理实现自己的JAVA方法运行超时应用
- Linux中关于JAVA调用C生成的.so动态链接库
- java方法调用之动态调用多态(重写override)的实现原理——方法表
- Java动态代理实现模拟RMI远程方法调用