testDll.java//java源代码package dll;public class testDll
{
private native int back();
static
{
try
{
System.loadLibrary("testDll");
}
catch(SecurityException e)
{
System.err.println("security failed "+e);
}
}

public void back1()
{
String s="";
s +=back();
System.out.println(s);
}
}testDll.h//生成的c的头文件/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class testDll */#ifndef _Included_testDll
#define _Included_testDll
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     testDll
 * Method:    back
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_testDll_back
  (JNIEnv *, jobject);#ifdef __cplusplus
}
#endif
#endiftestDll.c//自己编写的c的源代码#include <stdio.h>
#include "testDll.h"JNIEXPORT jint JNICALL 
Java_testDll_back(JNIEnv * jEnv, 
  jobject this) {
  return 2;
}testDll.jsp//jsp文件用来调用testDll.java(把它作为javaBean调用)<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import ="dll.testDll" %><jsp:useBean id="mydb" scope="session" class="dll.testDll" />
<jsp:setProperty name="mydb" property="*" />
<html>
<body><font size=4>
<%! String msg; %>
<% msg =request.getParameter("msg"); %>
<% mydb.back1();%>
</font>
</body>
</html>如果我把testDll.java的方法back1()中的back()注释掉,不会出现错误。
如果不注释掉,就会出现如下错误:
java.lang.UnsatisfiedLinkError: back
at dll.testDll.back(Native Method)
at dll.testDll.back1(testDll.java:25)
at org.apache.jsp._0002fjsp_0002ftestDll_jsp._jspService(_0002fjsp_0002ftestDll_jsp.java:111)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:107)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.jasper.servlet.JspServlet$JspServletWrapper.service(JspServlet.java:201)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:381)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:458)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:215)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2314)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:462)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:163)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:1000)
at org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1093)
at java.lang.Thread.run(Thread.java:484)请高手解答!

解决方案 »

  1.   

    看很多地方介绍,这是找不到DLL文件导致的,可是我把DLL文件移走,出现的是另外一种错误提示:java.lang.UnsatisfiedLinkError: no testDll in java.library.path
    所以我想是不是可以找到DLL文件,但是找不到入口,无法调用DLL里的方法。
      

  2.   

    这么长的文章我也没看懂^_^我们没在WINDOWS下用过JNI,这两天我在UNIX下学着用,根据错误提示应该是到不到共享库
    是不是你在javabean中用到jni?我只能建议你检查检查看少了没少那个文件?或者需要包含的文件都在不在?希望你的问题能加决,
      

  3.   

    找到错误了,因为加了package,但是我以前用javaBean,如果没有package是不行的,现在有了package却不行了,搞不懂,加不加package到底有什么关系?
      

  4.   

    你所说的加入package,指的是testdll.java 文件中的吗?对包我也没用过,只是知道一些概念,如果你把它打包了,那可要放到适当地路径里,根据你现在的安排,应该在classes目录中创建dll目录,然后把testdll.java放入目录中。之所以你去了package就可以,是因为testdll.class文件正好在classes目录中。
      

  5.   

    我最开始是创建了dll目录的,也加了package,可就是找不到路径,后来移到classes下,去掉package,就可以了,
    而且,我以前用javaBean,如果没有package,直接放在classes下,也会出问题,
    头都大了,呵呵
      

  6.   

    嘿,night_knight问题解决了吗?
    我也遇到同样的问题,如果解决的话,能不能告诉我方法,多谢![email protected]
      

  7.   

    现在又有一个问题
    我往一个数组里添加一个int出错
    int value;
    (*jEnv)->SetObjectArrayElement(jEnv, object, 0, value);warning C4047: 'function' : 'struct _jobject *' differs in levels of indirection from 'int '
      

  8.   

    你的c文件及dll放在什么目录下呀