jni编译dll
‘壹’ java中怎么调用vb编写的dll文件啊,网上找了很多例子了,都不行。希望可以有详细的代码,谢谢大家了。
用JNI(Java Native Interface),它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。
使用步骤:
·使用javac命令编译所编写的java类·编写带有native声明的方法的java类
JNI
,然后使用javah + java类名生成扩展名为h的头文件
·使用C/C++实现本地方法
·将C/C++编写的文件生成动态连接库
·ok
1) 编写java程序:这里以HelloWorld为例。
代码1:
public class HelloWorld {
public native void displayHelloWorld();//所有native关键词修饰的都是对本地的声明
static {
System.loadLibrary("hello");//载入本地库
}
public static void main(String[] args) {
new HelloWorld().displayHelloWorld();
}
}
声明native方法:如果你想将一个方法做为一个本地方法的话,那么你就必须声明该方法为native的,并且不能实现。其中方法的参数和返回值在后面讲述。 Load动态库:System.loadLibrary("hello");加载动态库(我们可以这样理解:我们的方法 displayHelloWorld()没有实现,但是我们在下面就直接使用了,所以必须在使用之前对它进行初始化)这里一般是以static块进行加载的。同时需要注意的是System.loadLibrary();的参数“hello”是动态库的名字。
2) 编译
没有什么好说的了javac HelloWorld.java
3) 生成扩展名为h的头文件javah HelloWorld
jni HelloWorld 头文件的内容:
/*DO NOT EDI TTHIS FILE - it is mach inegenerated*/
#include<jni.h>
/*Header for class HelloWorld*/
#ifndef_Included_HelloWorld
#define_Included_HelloWorld
#ifdef__cplusplus
extern"C"{
#endif
/*
*Class:HelloWorld
*Method:displayHelloWorld
*Signature:()V
*/
JNIEXPORTvoidJNICALL
Java_HelloWorld_displayHelloWorld(JNIEnv*,jobject);
#ifdef__cplusplus
}
#endif
#endif
JNI
(这里我们可以这样理解:这个h文件相当于我们在java里面的接口,这里声明了一个Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject);方法,然后在我们的本地方法里面实现这个方法,也就是说我们在编写C/C++程序的时候所使用的方法名必须和这里的一致)。
4) 编写本地方法实现和由javah命令生成的头文件里面声明的方法名相同的方法。
代码2:
#include"jni.h"
#include"HelloWorld.h"
JNI3//#includeotherheaders
JNIEXPORTvoidJNICALL
Java_HelloWorld_displayHelloWorld(JNIEnv*env,jobjectobj)
{
printf("Helloworld!\n");
return;
}
JNI
注意代码2中的第1行,需要将jni.h(该文件可以在%JAVA_HOME%/include文件夹下面找到)文件引入,因为在程序中的JNIEnv、 jobject等类型都是在该头文件中定义的;另外在第2行需要将HelloWorld.h头文件引入(我是这么理解的:相当于我们在编写java程序的时候,实现一个接口的话需要声明才可以,这里就是将HelloWorld.h头文件里面声明的方法加以实现。当然不一定是这样)。然后保存为 HelloWorldImpl.c就ok了。
5) 生成动态库
这里以在Windows中为例,需要生成dll文件。在保存HelloWorldImpl.c文件夹下面,使用VC的编译器cl成。 cl -I%java_home%\include -I%java_home%\include\win32 -LD HelloWorldImp.c -Fehello.dll 注意:生成的dll文件名在选项-Fe后面配置,这里是hello,因为在HelloWorld.java文件中我们loadLibary的时候使用的名字是hello。当然这里修改之后那里也需要修改。另外需要将-I%java_home%\include -I%java_home%\include\win32参数加上,因为在第四步里面编写本地方法的时候引入了jni.h文件。
如果配置了MinGW,也可以这样来编译:gcc -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at -Id:/java/include –Id:/java/include/win32 -shared -o (输出的dll文件名,如sum.dll) (输入的c/c++源文件,如abc.c)。
6) 运行程序
javaHelloWorld就ok.
如果用eclipse,需将dll或so文件放在项目下,而不是src及其子目录下。
如果用命令行编译,把dll文件放在该包的同目录下。
‘贰’ JAVA中用JNI调用了在WIN32下编译的DLL,如果在linux下执行这个JAVA程序,是否还可以继续调用的DLL。
直接是不行的! linux里面没有dll。
不过看你的需求应该是java调用了其他程序别写的功能,在linux里面肯定可以!Linux也有动态链接库的概念,不过叫Share Object ,你编译一个.so的文件,然后还是使用JNI调用。
参考:
编译so:http://www.cnblogs.com/ardar/articles/357321.html
java调用:http://..com/question/488673981.html
‘叁’ java中怎么编写dll文件........最好举个例子
你是指使用动态链接吗?这个可以用java中的反射机制做到,但是java中是没有动态链接库这种东西的。如果你指的是java调用本地dll的话,是使用jni技术,dll也不是java编写的。总是java是不可能编译成为dll。有一种这种的方案,就是将java编译的文件转换为c#的,微软有相应的工具,可以搜到,然后就可以打包成为dll了。
‘肆’ System.IO.FileNotFoundException JAVA调用的时候出这个错误,c++调用的时候正常执行
这个首先这个异常的名称是文件没有找到,你应该是通过java的JNI的来调用dll文件吧。
java使用JNI调用dll,一般会把dll文件放到系统system32文件夹下或者JDK下的bin目录里面
‘伍’ 把c文件编译成dll文件
1、Ic -->Id
2、你的jdk装没装,没装的话找找装上,提示NO such file or directory
装了的话,找找你安装的文件夹替换上
‘陆’ java使用JNI调用VC6.0编写的动态链接库dll,如何移植到linux环境下使用
你想要的应该基本不可能实现了,gpsun.lib是在window下生成的静态库,是不能在linux上直接调用的,如果你清楚gpsin的实现,可以在linux下编一个自己的静态库,是以.a结尾的,然后在linux上编译.so文件时将这个.a文件链接进去,最后就可以用jni去调用了
‘柒’ clion编译jni,找不到jni.h的解决办法
在windows环境下生成的动态库是 dll
在linux下生成so
在mac下生成的是dylib
所以对于Android的开发者来说,还是要用ndk的工具
把在idea生成的.h文件粘贴到clion的项目中就可以了,
如果找不到jni.h可以在CMakeList.txt中添加对jni.h文件的引用
如下:
后面三行根据jdk的实际位置填写,作用是导入jni相关的头文件;其他的操作系统可能不完全一致
复制.h头文件 com_shenby_jni_JniExample.h
实现该文件定义的函数 com_shenby_jni_JniExample.c
在CMakeList.txt中添加生成动态共项库
add_library:生成一个库,add_executable:生成一个可执行文件
hello:是生成共享库的名字,前面会自动加上lib前缀,如这里windows生成的是 libhello.dll
SHARED:库的类型为动态,windows上生成.dll,而STATIC 则是生成静态库,windows生成.a文件
com_shenby_jni_JniExample.c :c源文件,多个文件就添加在后面,切记不能添加上面的com_shenby_jni_JniExample.h
文件,否则生成的库中的函数为空
结果如下
就可以把该dll文件粘贴到idea的项目根目录中运行了
‘捌’ java 调用动态链接库(jni方式调用dll文件)
jni 是由Java调用C/C++的动态链接库 (DLL)。
所以把.class-->.h-->dll ,想法是不正确的,
同时也违背了Jni的初衷。
Dll是由C/C++生成的。
以前的一个项目用到了Java调用C/C++的DLL,所以对这个还算熟悉。
那个dLL是由C++程序员写的,在Microsoft Visual C++ 6.0编辑器中可以生成。然后由Java程序员用JNI来调用DLL里面实现的功能(方法)。