查看: 57299|回复: 12

JAVA调用DLL简单小例子

[复制链接]
论坛徽章:
5
ITPUB元老
日期:2005-02-28 12:57:00授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB8周年纪念徽章
日期:2009-09-27 10:21:222013年新春福章
日期:2013-02-25 14:51:24
跳转到指定楼层
1#
发表于 2003-3-26 09:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个小例子用JNI调用了VC++做的DLL动态库。

1、总体说明:
实现一个函数,传入整形数i,返回值i*i,这个函数做在DLL中,java将通过JNI调用这个函数,传入一个参数,得到返回值。
确定DLL的名称为calldll.dll,函数shanfei(int i)。

2、编写java程序javacall.java,如下:
public class javacall
{
        static
        {
                System.loadLibrary("calldll";
        }
       
        public native static int shanfei(int i);
       
        public static void main(String[] args)
        {
                javacall jc = new javacall();
                int j;
                j = jc.shanfei(4);
                System.out.println(j);
        }
}

3、编译
javac javacall.java

4、生成头文件
javah javacall
生成javacall.h文件

5、制作VC++动态库
建立新DLL工程,程序中添加:

#include "javacall.h"

JNIEXPORT jint JNICALL Java_javacall_shanfei (JNIEnv *, jclass, jint p)
{
        int j = p*p;
        return j;

别忘了将javacall.h复制到VC工程目录中,然后编译,如果编译说找不到jni.h文件,可以将jni.h复制到工程目录中,还可将javacall.h文件中的#include <jni.h>改为#include "jni.h",再编译。

6、java调用
将生成的calldll.dll文件复制到javacall.java所在的目录中,运行
java javacall,应该可以看到运行结果。
论坛徽章:
8
ITPUB元老
日期:2005-09-04 16:00:38授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:342010新春纪念徽章
日期:2010-03-01 11:19:07ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11
2#
发表于 2003-3-26 11:50 | 只看该作者
假如上面的那个类在一个package里面,你怎么让他正确执行呢?

使用道具 举报

回复
论坛徽章:
5
ITPUB元老
日期:2005-02-28 12:57:00授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB8周年纪念徽章
日期:2009-09-27 10:21:222013年新春福章
日期:2013-02-25 14:51:24
3#
 楼主| 发表于 2003-3-27 16:49 | 只看该作者
把dll放到系统目录中应该可以吧,我还在研究,好多要学的东西。

使用道具 举报

回复
论坛徽章:
387
马上加薪
日期:2014-07-30 15:56:19itpub13周年纪念徽章
日期:2014-09-30 11:08:572015年新春福章
日期:2015-03-04 14:19:112015年新春福章
日期:2015-03-06 11:57:31
4#
发表于 2007-3-9 10:51 | 只看该作者
搜到这个。遇到java call dll的问题。

使用道具 举报

回复
论坛徽章:
46
凯迪拉克
日期:2013-08-22 10:00:10Jeep
日期:2013-08-10 07:21:13ITPUB社区12周年站庆徽章
日期:2013-10-08 14:57:28ITPUB十周年纪念徽章
日期:2011-11-01 16:20:282012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07奥运会纪念徽章:体操
日期:2008-10-24 13:08:31会员2007贡献徽章
日期:2007-09-26 18:42:10马上加薪
日期:2014-04-11 09:34:11秀才
日期:2015-09-06 10:19:32
5#
发表于 2007-3-9 16:25 | 只看该作者
混合编程,很累很烦的,尽量还是少用。

使用道具 举报

回复
论坛徽章:
131
乌索普
日期:2017-09-26 13:06:30马上加薪
日期:2014-11-22 01:34:242014年世界杯参赛球队: 尼日利亚
日期:2014-06-17 15:23:23马上有对象
日期:2014-05-11 19:35:172014年新春福章
日期:2014-04-04 16:16:58马上有对象
日期:2014-03-08 16:50:54马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14
6#
发表于 2007-3-9 19:18 | 只看该作者
最初由 licy 发布
[B]假如上面的那个类在一个package里面,你怎么让他正确执行呢? [/B]

把dll放到classpath的路径里, 而且要精确到文件名, 不像jar写到目录名字就可以了

使用道具 举报

回复
论坛徽章:
0
7#
发表于 2007-3-11 00:41 | 只看该作者
安装的时候直接放到System32目录就可以了,这种东西真的是尽量少用的好,出了问题很不好调试。

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2006-05-29 09:29:05
8#
发表于 2007-3-11 15:07 | 只看该作者
呵呵!跑来看看!

使用道具 举报

回复
论坛徽章:
39
ITPUB元老
日期:2005-10-13 10:38:002012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB官方微博粉丝徽章
日期:2011-07-04 09:42:062011新春纪念徽章
日期:2011-02-18 11:43:352011新春纪念徽章
日期:2011-01-04 10:36:17ITPUB9周年纪念徽章
日期:2010-10-08 09:34:022010新春纪念徽章
日期:2010-03-01 11:07:27祖国60周年纪念徽章
日期:2009-10-09 08:28:002009新春纪念徽章
日期:2009-01-04 14:52:282008新春纪念徽章
日期:2008-02-13 12:43:03
9#
发表于 2007-3-12 11:06 | 只看该作者
是比较费劲

使用道具 举报

回复
论坛徽章:
387
马上加薪
日期:2014-07-30 15:56:19itpub13周年纪念徽章
日期:2014-09-30 11:08:572015年新春福章
日期:2015-03-04 14:19:112015年新春福章
日期:2015-03-06 11:57:31
10#
发表于 2007-3-12 18:51 | 只看该作者
http://www.codeproject.com/java/jnibasics1.asp
这里是一个java call  dll的例子。
还没有仔细看过。
利用jni

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表