有谁用过jsp调用本地接口的,请到这里来

Karnak 2002-03-05 10:48:33
我用jsp调用jni时,出现这种错误提示:
java.lang.UnsatisfiedLinkError:
请问是怎么产生的?
...全文
142 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
Karnak 2002-04-30
  • 打赏
  • 举报
回复
我发现原因了,原来就是因为javah -jni这个冬冬不会自己添加package,需要手动添加,这样就可以了!
leonzhao 2002-03-10
  • 打赏
  • 举报
回复
你找不到这个类?是什么意思呢?没有这个类的源文件?
如果是这样的话,你就不能打包了,只能不打包的发布,然后使用到你的JSP众直接import classname的方式调用这个类。
Karnak 2002-03-10
  • 打赏
  • 举报
回复
可是我都找不到这个类啊
leonzhao 2002-03-08
  • 打赏
  • 举报
回复
没有,只要加了package,你一定要重新生成.h文件。
night_knight 2002-03-08
  • 打赏
  • 举报
回复
如果加了package,就一定要用javah com.ibm.mm.sdk.addons.KmDSG吗?有没有更简单点的方法,我原来只要javah -jni就行了,应该会有简单的写法吧!
肖尧19 2002-03-07
  • 打赏
  • 举报
回复
有意思~
leonzhao 2002-03-07
  • 打赏
  • 举报
回复
另外上面的一些大侠的说法有一些问题的:
1、Java,JSP,APPLET都是一样的,没理由这个能调用哪个就不行(APPLET会特殊一些)
2、DLL只要放在任何path路径下就可以了,不一定在system32下。
3、你说的不对,JSP也可以调用不在任何package里面的类:
import="java.io.*,
java.util.*,
KmDSG"
这样的话即使KmDSG不在任何包中也可以使用了。
leonzhao 2002-03-07
  • 打赏
  • 举报
回复
就是说,如果你的Java打了包,就需要重新生成一次.h文件了。
例如我上面的例子:
打包前.h里面是JNIEXPORT jstring JNICALL Java_KmDSG_cGetFileSummary
然后打包到com.ibm.mm.sdk.addons
打包后重新执行
javah com.ibm.mm.sdk.addons.KmDSG(KmDSG.class和KmDSG.java在./com/ibm/mm/sdk/addons/目录下)
然后你就拿到了新的.h文件,按照新的.h文件重新改一下你的.c程序。重新发布这个DLL就可以了(重起JVM)。
leonzhao 2002-03-06
  • 打赏
  • 举报
回复
哎呀,再说一遍,UnsatisfiedLinkError一定是DLL中方法的名字不对了!要不就重新编译这个DLL,要不就直接不打包,然后使用import class_name的方法直接调用这个类。

结帐!
scarab 2002-03-06
  • 打赏
  • 举报
回复
你把DLL放到该JAVA文件一个目录下看看呢?
leonzhao 2002-03-06
  • 打赏
  • 举报
回复
JNI加了Package就需要重新生成.h并更改dll的C源程序中所有的方法名,要求和.h中的完全对应上,然后再重新编译dll并重新发布,重起Web服务器。

例如:没有打包前是KmDSG.h,方法是JNIEXPORT jstring JNICALL Java_KmDSG_cGetFileSummary

打包后是com_ibm_mm_sdk_addons_KmDSG.h,方法是JNIEXPORT jstring JNICALL Java_com_ibm_mm_sdk_addons_KmDSG_cGetFileSummary
Karnak 2002-03-06
  • 打赏
  • 举报
回复
leonzhao(灯泡) 你这用的是什么啊,我只是很简单的
javah -jni testDll.java 而已,你的是什么这么复杂,
com_ibm_mm_sdk_addons_KmDSG这段是要手动修改吗?
Karnak 2002-03-06
  • 打赏
  • 举报
回复
我做了一个testDll,直接放在目录下,没有用package,调用成功了,可是给他改个名字就有出现那个错误了,动态连接库肯定找到了,我在里面加了一个catch(UnsafitiedLinkError e),我把dll移走,就抛出了异常,所以肯定找到了dll,但是不知道为什么改个名字就不行,用了好多名字,只有testDll可以,奇怪了
Karnak 2002-03-05
  • 打赏
  • 举报
回复
我的路径是这样的 tomcat\classes\softCert\
CLASSPATH已经指向了tomcat\classes
我的java文件加了package softCert;这样在java下执行就不能通过,
可是不加package softCert;在jsp下又不能通过,这可怎么办?
night_knight 2002-03-05
  • 打赏
  • 举报
回复
我在java下调用过,jsp没有试过,没碰到过这种问题,关注......
gzwrj 2002-03-05
  • 打赏
  • 举报
回复
定义本地方法
与其他方法相似,你必须声明要用的所有本地方法,并且必须将它们定义在一个类中。
你可将你的本地HelloWorld方法定义为如下形式:
public native void nativeHelloWorld();
这与你所写的其他public void方法比较有两个变化:
* 关键字native被用作方法修饰符。
* 方法的主体部分(实际实现部分)在这里没有定义,而是代之以一个分号(;)。
你必须把本地方法的声明放到类的定义中。含有这个本地方法的类还包含一个静态代码块,它负责装载带有该方法实现的动态库。这里是为简单的nativeHelloWorld()方法而写的类定义的一个例子:
class NativeHello {
1.public native void nativeHelloWorld();
2.static {
3.System.loadLibrary("hello1");
4.}
5.}
Java运行环境在类被装载时执行定义的static代码块。在上例中,当类NativeHello被装载时,库hello1被装入。

调用本地方法
一旦你已将本地方法放入到一个类中,就可以为该类创建对象以存取这个本地方法,这与处理普通的类方法相似。这里,我们举例说明程序是如何创建一个新的NativeHello对象并调用你的nativeHelloWorld方法的:
1.class UseNative {
2.public static void main (String args[]) {
3.NativeHello nh = new NativeHello();
4.nh.nativeHelloWorld();
5.}
6.}

用javac来编译.java文件。.class文件在创建头文件时会被使用。

javah工具
你可用javah工具来创建基于NativeHello.class文件的C头文件。对javah的调用方式如下:
% javah -jni NativeHello
所产生的文件,NativeHello.h,为你提供了编写C程序所需的消息。这里给出了对于本例javah所产生的文件:
/* DO NOT EDIT THIS FILE - it is machine generated */
1.#include <jni.h>
2./* Header for class NativeHello */
3.
4.#ifndef _Included_NativeHello
5.#define _Included_NativeHello
6.#ifdef __cplusplus
7.extern "C" {
8.#endif
9./*
10.* Class: NativeHello
11.* Method: nativeHelloWorld
12.* Signature: ()V
13.*/
14.JNIEXPORT void JNICALL Java_NativeHello_nativeHelloWorld
15.(JNIEnv *, jobject);
16.
17.#ifdef __cplusplus
18.}
19.#endif
20.#endif
21.
其中的黑体字符部分给出了将要实现的本地方法的签名。

为本地方法编写C函数代码
到此为止,C程序是唯一缺少的代码部分。你所编写的C代码必须包含上面的头文件,以及在$JAVA_HOME/include目录中由JDK所提供的jni.h。($JAVA_HOME指JDK的"根"目录。)当然,也要包含你的函数所必需的其他头文件。
对每一个在头文件中声明的函数,你都要提供函数体。对本例来说,称为MyNativeHello.c的C文件如下:
#include <jni.h>
1.#include "NativeHello.h"
2.#include <stdio.h>
3.
4.void Java_NativeHello_nativeHelloWorld
5.(JNIEnv *env, jobject obj) {
6.printf ("Hello from C");
7.}
8.

·将它合并

现在你已准备好了所有片断,必须告诉系统如何将它们集合起来。首先,编译你的C程序。也许你必须指定include文件的位置。
下例使用了Solaris操作系统中的C编译器:
% cc -I$JAVA_HOME/include -I$JAVA_HOME/include/solaris -G MyNativeHello.c -o libhello1.so
为了编译代码,你必须存取的两个包含目录是$JAVA_HOME/include和$JAVA_HOME/include/solaris。你可以在命令行上指定它们,或者采用修改INCLUDE环境变量的方式。
C:\> cl MyNativeHello.c -Fehello1.dll -MD -LD javai.lib
一旦创建完库文件,你就可运行你的本地方法测试文件了:
% java UseNative
Hello Native World!

C:\> java UseNative
Hello Native World!
如果你被给出java.lang.UnsatisfiedLinkError信息,则需要更新系统的LD_LIBRARY_PATH变量来包含当前目录(使得JVM可找到libhello1.so)。
Karnak 2002-03-05
  • 打赏
  • 举报
回复
找不到本地接口的定义,我是在tomcat下使用的,调用c的动态链接库,不知道是需要放在什么地方才能让tomcat找到?
night_knight 2002-03-05
  • 打赏
  • 举报
回复
关注......
Karnak 2002-03-05
  • 打赏
  • 举报
回复
DLL已经放在system32下了,没理由找不到
主要是package的问题
jsp必须创建一个目录然后加一个package
可是jni如果加了package就会出错,至少我这里是这样,
这可就矛盾了,你们说该怎么办?
jean777 2002-03-05
  • 打赏
  • 举报
回复
帮你up---学习---成功了给个得sample
jean777@etang.com
加载更多回复(3)

23,407

社区成员

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

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