免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1669 | 回复: 0
打印 上一主题 下一主题

Java通过JNI调用C++动态链接库 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-26 10:44 |只看该作者 |倒序浏览

项目需要java调用C++写的模块,在网上找到了java可以用jni调用C++的动态链接库。自己照着网上的方法调试通过。下面是调试过程。本文资料主要参考一下两个链接:
http://www.programfan.com/article/1660.html
   本文的例子来源
http://xhdxhy.javaeye.com/blog/186468
     用vs2005生成C++的dll库

JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法。
一、JAVA中所需要做的工作
例如程序testdll.java,内容为:
public class testdll
{
//在JAVA程序中,首先需要在类中声明所调用的库名称。在这里,库的扩展名字可以不用写出来,究竟是DLL还是SO,由系统自己判断。
static
{
  System.loadLibrary("hello");
}
//还需要对将要调用的方法做本地声明,关键字为native。并且只需要声明,而不需要具体实现。
public native static int get();
public native static void set(int i);
public static void main(String[] args)
{
  testdll test = new testdll();
  test.set(10);
  System.out.println(test.get());
}
}
然后编译该JAVA程序文件,生成CLASS,再用JAVAH命令,JNI就会生成C/C++的头文件。
用javac testdll.java编译它,会生成testdll.class。
再用javah testdll,则会在当前目录下生成testdll.h文件,这个文件需要被C/C++程序调用来生成所需的库文件。

二、C/C++中所需要做的工作
对于已生成的testdll.h头文件,C/C++所需要做的,就是把它的各个方法具体的实现。然后编译连接成库文件即可。再把库文件拷贝到JAVA程序的路径下面,就可以用JAVA调用C/C++所实现的功能了。
用vs2005新建vc++ -> 类库项目,项目名称与 System.loadLibrary("hello"); 中的hello相同。将javah生成的testdll.h中内容拷贝到工程的hello.h文件,在hello.cpp文件中加入如下代码:
int i = 0;
JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass)
{
return i;
}
JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint j)
{
i = j;
}
编译时要用到一些Java里面的头文件,所以应该把位于下面目录
D:\jdk6\include
中的所有文件都拷到
C:\Program Files\Microsoft Visual Studio 8\VC\include
目录下。
上面两个路径依自己的机子而定
若不拷到这里的话,也可以明确指定路径。或者在java程序目录下建立一个include目录,将
D:\jdk6\include
中的所有文件都拷到该目录中。要不然会报错,说找不jni.h文件。
在vc2005中的工程项目属性中选中C/C++,在右边的附加包含目录项中加入目录:E:\ProgramLib\Java\testdll\include (这是我java程序所在的目录)。然后编译链接生成dll文件。
将生成的DLL文件放在 C:\WINDOWS\system32 目录下,或者放在与Java程序位于相同的目录下。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/88970/showart_2007474.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP