调用没有源代码的dll文件

当使用jni或者jna调用dll的时候,如果dll是加密的话,并且没有源文件,也没有.h头文件而且不知道方法的定义就很难直接调用了,需要通过c语言生成一个中间库,在中间库中调用给的dll

 

首先需要在java中定义好要调用的方法,然后编译成class,然后通过javah生成一个.h头文件,一般如下

 

 

标红处就是对应我们的java方法

 

 

然后根据生成的.h头文件编写方法体

 

 

方法体内容看业务,在这里主要是调用第三方给的dll,然后通过c语言调用后拿到返回值,再通过我们的方法返回出去,然后在我们的代码中就可以调用了

 

也可以通过第三方dll 生成lib在中间库静态调用

  1. 运行dumpbin命令来获得dll的所有导出函数的列表:
dumpbin /exports C:\yourpath\yourlib.dll

 

 

2.创建.def文件

现在复制所有这些函数名(只有name!)并粘贴到一个新的文本文件。命名yourlib.def,并将“EXPORTS”行放在它的顶部。我的yourlib.def文件如下:

EXPORTS
_magic_func
_PG_init
exec_get_datum_type
exec_get_datum_type_info
pg_finfo_plpgsql_call_handler
pg_finfo_plpgsql_inline_handler
pg_finfo_plpgsql_validator
plpgsql_DumpExecTree
plpgsql_HashTableInit
plpgsql_IdentifierLookup
plpgsql_add_initdatums
plpgsql_adddatum

现在,从这个定义文件中,可以创建.lib文件了。为此,我们使用“lib”命令

lib /def:C:\mypath\mylib.def /OUT:C:\mypath\mylib.lib /machine:x86

 

在VS中添加lib库的三种方法:

注意:

1、每种方法也要复制相应的DLL文件到相应目录,或者设定DLL目录的位置,具体方法为:"Properties" -> "Configuration Properties" -> "Debugging",在"Working Directory"设置dll的路径就可以了

2、无论是设置DLL目录,或者是Lib目录,亦或是头文件的目录,都有release版本和debug版本的区分,每种版本的设置都是独立的,要分别设置。

 

方法1:  通过设置工程配置来添加lib库.

A、添加工程的头文件目录:工程---属性---配置属性---c/c++---常规---附加包含目录:加上头文件存放目录。

B、添加文件引用的lib静态库路径:工程---属性---配置属性---链接器---常规---附加库目录:加上lib文件存放目录。

C  然后添加工程引用的lib文件名:工程---属性---配置属性---链接器---输入---附加依赖项:加上lib文件名。

这种方法比较繁琐,且不直观,而且还可能要争对debug版本和release版本作不同的配置,因为我们生成的两个版本的库可能放在不同的目录中的.

我是用vs6.0编译的,对c语言不熟悉,就是用的这种方法

 

方法2: 使用编译语句:

#ifdef _DEBUG

#pragma comment(lib,"..\\debug\\LedCtrlBoard.lib")

#else

#pragma comment(lib,"..\\release\\LedCtrlBoard.lib")

#endif

这种方法直观,方便,且可以按如上直接区分出Debug版本和Release版本的不同目录.当然,通过宏,还可以区分更多版本.

但是在指定目录时,不小心容易出错.

 

方法3: 直接添加库文件到工程中.

就像你添加.h和.cpp文件一样,把lib文件添加到工程文件列表中去.

VC中,切换到"解决方案视图",--->选中要添加lib的工程-->点击右键-->"添加"-->"现有项"-->选择lib文件-->确定.

就是这么简单,搞定.

这个方法适用于在我的工程的debug版本和Release版本中都使用同一个lib库文件时.这样就省去了你1方法配置环境的繁琐,也省去了方法2种语句的可能性错误发生.

 

然后在中间库中引入第三方lib,然后编写业务代码就好了

然后编译 类似如下

java2dll>cl -I J:\java\jkd1.7_32\include -I J:\java\jkd1.7_32\include\win32 -LD java2dll.cpp Dogskin.lib -Fepasencode.dll

然后通过生成的dll去通过java调用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值