社区
Java SE
帖子详情
java调用C/C++编写的DLL文件问题,请有经验的高手指教?
sssmmx
2002-09-17 02:03:43
现有一个用C/C++编写的DLL文件,(只知道接口声明没有源代码修改权限),看了一些有关论坛有关DLL和JNI的文章,有人提到用代理DLL,但不知具体怎么做,请高手们指点。一定给分。
...全文
1705
7
打赏
收藏
java调用C/C++编写的DLL文件问题,请有经验的高手指教?
现有一个用C/C++编写的DLL文件,(只知道接口声明没有源代码修改权限),看了一些有关论坛有关DLL和JNI的文章,有人提到用代理DLL,但不知具体怎么做,请高手们指点。一定给分。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
sssmmx
2002-09-24
打赏
举报
回复
感谢大家支持,这几天我在IBM中文及SUN官方网站中找了不少关于JNI的文章,受益非浅,希望
有相关问题的朋友,可到那找查相关资料.
1)在 Windows 中实现 Java 本地方法
http://www-900.ibm.com/developerWorks/cn/java/jnimthds/index.shtml
2)Java Native Interface: Programmer's Guide and Specification
http://java.sun.com/docs/books/jni
上面的文章对JNI介绍非常详细,对JNI有性趣的朋友可以看看.
对于我提出的问题,我己有了成功例子,贴出来与大家分享.
有一myDll.dll库,接口Trim(LPSTR lpString),功能是把lpString中的空格去掉。文件原码
如下:
#include <string.h>
#include <windows.h>
#ifdef _cplusplus
extern "C"{
#endif
__declspec(dllexport) void Trim(LPSTR lpString)
{
int iLength = strlen(lpString);
int iCount = 0;
char *lpChar = lpString;
int i;
for(i=0;i<iLength;i++)
{
if( *lpChar != ' ' )
{
lpString[ iCount ] = *lpChar;
iCount ++;
}
lpChar ++;
}
lpString[iCount ++] = 0;
}
#ifdef _cplusplus
}
#endif
(用VC6的cl编译该文件生成动态链接库,cl -LD myDll.c -FemyDll.dll )
这里假设我们不能得到该动态链接库的原代码,只有DLL及LIB文件,在通过JNI用java调用时
,由于没有DLL原代码修改权限,需要我们自己用C/C++再做一个中介库DLL2,java调用这个
中介库,该中介库再调用原如的DLL库,间接实现java本地方法的调用。
下面是我做的例子,环境:Win2000Server,JDK1.3,VC6.0
先编一个java程序,java2dll.java,代码如下:
public class Java2dll
{
//声明要用到的本地方法cTrim由中介库(java2dll.dll)实现,它又调用了myDll.dll库的T
rim(...)函数
private native String cTrim(String str);
static
{
System.loadLibrary( "java2dll" ); //加载本地方法(java2dll为动态
链接库文件名)
}
//自己定义的一个java方法,调用本地方法cTrim(),有点多余,实际上你可直接访
问本地方法cTrim()
public String javaTrim(String str)
{
return cTrim(str);
}
//演示结果
public static void main(String[] args)
{
Java2dll ss = new Java2dll();
String str1="I love You.";
String str2=ss.javaTrim(str1);
System.out.println("调用c DLL前:");
System.out.println("str1="+str1);
System.out.println("调用c DLL后:");
System.out.println("str2="+str2);
}
}
编译该文件,生成Java2dll.class文件:
javac Java2dll.java
生成C的头文件Java2dll.h:
javah -jni Java2dll
用C编写中介库java2dll.c
#include <stdio.h>
#include "java2dll.h"
JNIEXPORT jstring JNICALL Java_Java2dll_cTrim
(JNIEnv *env, jobject obj, jstring str)
{
const char *strTemp;
strTemp=(*env)->GetStringUTFChars(env,str,NULL);
//错误出现时
if(strTemp==NULL)
{
return NULL;
}
//调用myDll.dll库中的Trim()方法,去掉strTemp中的空格
Trim(strTemp);
return (*env)->NewStringUTF(env, strTemp);
(*env)->ReleaseStringUTFChars(env,str,strTemp);
}
说明:如果你用C++编写,cpp文件,上面代码中的“(*env)”应改为“env”
编译生成java2ddl.dll文件。
用VC6的cl编译。
cl -Id:\jdk13\include -Id:\jdk13\include\win32 -LD java2dll.c myDll.lib -Fejava2dll.dll
说明:-Id:\jdk13\include指明JNI需要的头文件.h位置,D:\JDK13为我的JDK安装目录
-LD 表明要生成动态链接库
myDll.lib或 -link
myDll.lib表明要把myDll.dll链接上,否则中介库java2dll找不到Trim(..)方法。
您可用cl /?得到HELP帮助。
编译成功后,可得到中介库java2dll,运行一下,检查结果。
java Java2dll
好了,你自己试一下吧。
sssmmx
2002-09-17
打赏
举报
回复
to chen_2001(威)
头三步我还明白,但后三步不太清楚,您的意思是在java2中直接调用(loadlibrary)dll吗?,好象要用到第3步生成的头文件,再用C++创建共享dll,然后再做第4步。
chen_2001
2002-09-17
打赏
举报
回复
使用以下6步:
1.写java程序(1.java)
2.javac 1.java
3.javah -jni 1.class
4.loadlibrary(@)(in 2.java)
5.javac 2.java
6.java 2
sssmmx
2002-09-17
打赏
举报
回复
话没说完,不小心提交了.
我忽然有点明白了,是一是我用C++做另一个dll文件(叫dll2),该文件调用原来的dll中函数,然后我再用java通过JNI方法调用dll2,这不就实现间接调用原来的dll,这个dll2就是中介动态链接库,或代理类,我要测一下。
sssmmx
2002-09-17
打赏
举报
回复
我忽然有点明白了,是一是我用C++做另一个dll文件(叫dll2),该文件调用原来的dll中函数,
sssmmx
2002-09-17
打赏
举报
回复
to clmate(印度阿三)
这个我试过了,但问题是我只有dll文件,没有权限,用JNI方法生成的头文件,没有dll文件的C++源代码,不可能象有关贴子说的生成共享DLL库.
clmate
2002-09-17
打赏
举报
回复
用代理dll怎么做,没听过,但用java调用c++的东西通常都是把c++的方法,在VC下生成一个dll文件,然后再用java的loadLibrary()方法来调用dll,你可以去看一下thinking in java的附录部分。
初次
调用
c++
编写
的
dll
文件
2.支持多种语言,因为做这个有一段时间了,现在发现c#也可以
调用
c++
的
dll
,说明
dll
的可移植性很强。 话不多说,咱们直接进行
调用
步骤: (1)先说比较直接,同时也是静态的
调用
(个人感觉最快,但是貌似很死板) ...
java
调用
c++
的第三方
dll
动态库详解
由于在项目中用到了
java
调用
c++
的SDK动态库的例子,博主之前没有接触过,所以一直在网上百度,千篇一律,经过几天的努力终于成功了。所以博主想把它记录下来,方便其他人参考。 以下是要
调用
的接口方法: /*******...
java
通过JNI
调用
C#
DLL
库
文件
目前在做一个项目遇到
java
调用
c# 库。网上的资料找了一大半,不好使。 后来
调用
思想转换了下如果用
java
直接
调用
...1、
java
通过jni
调用
c++
dll
和
c++
调用
c#
dll
网上有好多质料。不写步骤了。 2、需要注意的是: ...
Java
Native Interface(
Java
调用
Delphi、C、
C++
编写
的
DLL
)
Java
Native Interface(
Java
调用
Delphi、C、
C++
编写
的
DLL
)
Java
调用
C++
的步骤和一些自己的见解(详细款式)
本文本是想写个学习笔记供自己不时之需,但想了想既然都写了,不如就发出来好了,这也是...另,本文是基于笔者一天时间的查阅资料+测试而完成的,甚是稚嫩,定有许多不严谨以及不科学的描述,希望各位佬们不吝
指教
!
Java SE
62,614
社区成员
307,327
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章