java能调用delphi写的dll吗?(50分)

  • 主题发起人 主题发起人 grays
  • 开始时间 开始时间
G

grays

Unregistered / Unconfirmed
GUEST, unregistred user!
很简单的一个dll
project test
....
proceduredo
test;export
begin
end;
exports
dotest
....
java class如下
--------------
package wxy;
classdo
dll{
public static native voiddo
test ();
static {
System.loadLibrary("test");
}
}
public class My {
public My(){
}
public static void main(String [] argv) {
do
dll.dotest();
}
}
为什么报如下错误??
wxy.My
java.lang.UnsatisfiedLinkError:do
test
at wxy.dodll.dotest(Native Method)
at wxy.My.main(My.java:26)
Exception in thread "main" Process terminated with exit code 1
dll是找到了,可是用c++builder写的dll调用好像没有问题艾?
晕死,救命!
 
不会JAVA啊,干瞪眼ing...
 
上去==,^_^
 
將delphi的變量類型,改為windows類型,如:delphi 的string對應windows的ansitring,否則用delphi寫的dll只能在delphi下調用(BCB除外)。
 
to::wanderhouse
string是的
对integer来说应该pascal和c是一样的吧,不用改类型的吧!
 
Integer不用,你可以看一下:
Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters.
这段话,很清楚地说明了delphi dll的问题和解决方法。
 
我觉得你不要在java中调用native method,这样降低你的程序的可移植性和跨平台能力,如果这样的话,用java的意义也就不存在了。
 
tO:wanderhouse
我是写delphi的对你dll前面的话理解,integer不在它说明之列。用试过用vba掉丫,C++调丫都没有问题,就是java有,可是同事写的一个cb的没有问题!
我也不想用native method,可是公司研发部的给其它开发商做了一个dll作为接口,苦了我丫!
tomcat 3.3中可以,tomcat4.1中可以,那些开发商用tomcat做服务器,艾,BT丫!我们是用webshpere的!所以没有办法,自己写一个delphi的试试出这个问题,太FAINT了
 
看来我也帮不上你什么忙了
 
在delphi的DLL里面声明函数过程的时候在后面加上stdcall关键字
proceduredo
test;Stdcall
begin
end;
这样可以被Delphi以外的程序调用,不用考虑其他的因素
 
to:kirinma
加不加stadcall结果一样的
 
上面是dll调用时link错(白说,都知道)
1、用java先调通c的dll。(当初我搞了近一个星期。鼓掌!)
2、建议:给delphi的dll再加个c的dll,然后java去访问c的dll。
 
通过jni来调用 必须写一个满足java可以识别的本地码来实现
ef:
#include <jni.h>
#include "HelloWorld.h"
#include <stdio.h>
#include <windows.h>
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
(JNIEnv *, jobject)
{
printf("hello world!/n");
MessageBeep(0);
return;
}
这是C++里面的简单范例 Delphi里我就不知道了
:((
 
我最近也在整这个,有点难!
我现在连如何调试都不太清楚,请指点!
 
我已经调通了,不过DLL是用C++写的!
但是如何才能让WEB来调用我的JNI呢?
 
把你的Dll放在系统目录给你呀
调用的代码如下
public class WinCAClass {
private static final String SILIB = "EngineJava";
///这里是dll文件
static {
try {
System.loadLibrary (SILIB);
}
catch (UnsatisfiedLinkError e)
{ System.out.println ("native lib '" + SILIB + "' not found in 'java.library.path': ");
System.out.println( System.getProperty ("java.library.path"));
}
}
public native void SE_LoadLibrary();
}
public static void main(String[] args)
{
WinCAClass t =new WinCAClass();
try{
t.SE_LoadLibrary();
}catch (Exception e)
{
System.out.println(e.getMessage());
}
}
}
 
你通过C++再调用你的Delphi动态库不就得了!
 
我们测试时都是用JAVA应用程序来调的,如果是在WEB上,怎么来实现呢?
 
那写个javabean好了 用Jsp来调javabean呀 不就可以了呀
 
后退
顶部