关于JNI的问题

jaredcsdn 2004-03-08 06:32:13
有个小问题,还望高手指点:
  我要在Java中调用一段C代码,三千多行,懒得翻译,决定用JNI实现。却发现Java无法调用由MinGW编译出的dll文件中的函数。开始以为是C接口没弄好,后来才发现最简单的JNI都行不通,情况如下:

环境:WinXP, Sun JDK 1.4.2_03, MinGW v3.1.0

// Test.java
public class Test
{
public native static void show();

static {
System.loadLibrary("dllshow");
}

public static void main(String[] args)
{
System.out.println("Hello World!");
show();
}
}

用javah导出头文件(一字未改),编写dllshow.c。

// dllshow.c
#include <jni.h>
#include "Test.h"
#include <stdio.h>

JNIEXPORT void JNICALL
Java_Test_show (JNIEnv *env, jclass cls)
{
printf("Hello, dll\n");
return;
}

用MinGW编译成dllshow.dll,编译语句如下:
gcc -shared -o call.dll call.c -I%JAVA_HOME%\include -I%JAVA_HOME%\include\win32

然后运行Test就出事了:
E:\project\java\TestDLL>java Test
Hello World!
Exception in thread "main" java.lang.UnsatisfiedLinkError: show
at Test.show(Native Method)
at Test.main(Test.java:12)

从异常信息来看,并不是找不到动态连接库(dll),至于到底为什么我就搞不懂了。还请各位高手指点。
...全文
77 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jaredcsdn 2004-04-08
  • 打赏
  • 举报
回复
前面打错了,是后缀不是前缀,不好意思。
jaredcsdn 2004-04-08
  • 打赏
  • 举报
回复
结帖了。
jaredcsdn 2004-04-07
  • 打赏
  • 举报
回复
有办法了! 是gcc少了行参数。 如下:
gcc -I%JAVA_HOME%\include -I%JAVA_HOME%\include\win32 -Wl,--add-stdcall-alias -shared -o call.dll call.c
参数:-Wl,--add-stdcall-alias 可以为函数加上标准调用前缀(stdcall @nn)。
这样编译出的dll就可以了。都知道win32中dll中的函数要求有标准调用前缀,在JNI中不方便手动处理这个,Sun又没说清楚这事由编译器办。所以搞得我很郁闷。找了大半个月,终于在一个很古老的网页上找到答案。
网址:http://www.inonit.com/cygwin/jni/helloWorld/c.html
谢谢大家!
unixhunter 2004-03-18
  • 打赏
  • 举报
回复
请问对于不同的机器,不同的操作系统和软件等环境,运行相同的程序是否可能出现问题?
swei412 2004-03-17
  • 打赏
  • 举报
回复
我用Delphi改写你的代码,将.Dll文件放到与Test.class相同的目录,没有出现问题
unixhunter 2004-03-17
  • 打赏
  • 举报
回复
如果dll不放在test.class相同目录下,会出现如下提示(我作的是hellow程序):
Exception in thread "main" java.lang.UnsatisfiedLinkError: no hellow in java.library.path
 at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1312)
 at java.lang.Runtime.loadLibrary0(Runtime.java:749)
 at java.lang.System.loadLibrary(System.java:820)
 at HelloWorld.<clinit>(HellowWorld.java:10)
若dll放在test.class相同目录,会出现如楼主所出现的提示
wangxdsharing 2004-03-17
  • 打赏
  • 举报
回复
把你的dll放在与test.class相同的目录,或者把它放在系统System32目录下
fast_time 2004-03-17
  • 打赏
  • 举报
回复
你的dll要放在系统PATH(Windows)或者SH_LIBRARY_PATH(如果我没记错名字的话Unix)下
unixhunter 2004-03-17
  • 打赏
  • 举报
回复
我也遇到与楼主相同的问题,
环境:win2000 server,vc++6.0,jdk1.3.0_02
请教高手帮忙解决
liusoft 2004-03-17
  • 打赏
  • 举报
回复
set LD_LIBRARY_PATH=.so文件所在目录
export LD_LIBRARY_PATH
然后再执行你的JAVA程序

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧