是不是dll方的位置不对?

解决方案 »

  1.   

    applet是在沙箱中执行的,为了保障安全性,默认是不能管理任何和本地相关的资源的,包括本地方法的执行,在java的老的版本中这是规定死的,不可以更改applet的沙箱,在java2以后变得灵活一些,可以定制自己的沙箱,包括applet的类装载器,你可以看一下相关的java安全方面的书籍。
      

  2.   

    不是dll位置不对,我程序里用try和catch的  
    try{
      System.loadLibrary("MyHello1");
      }catch(UnsatisfiedLinkError e){
      System.out.println("Load Dll Failed!");
    }
    如果调用不了会输出load dll failed,一开始生成的dll会有这种情况,我干脆把dll拷到了system32目录,然后用regsvr32命令注册了dll,好像把dll文件放在java程序目录中也不行.
    在applet中就会出错,到底是怎么回事啊?各位救命啊.....
      

  3.   

    在Applet中可以使用dll文件。 dll文件只要copy到winnt/system32(win2k)或者windows(win98)下就可以了。不一定要注册。出现你的那种情况,可能是dll文件加载的未成功的问题。 请确认dll文件是否加载成功。还有,最好能给出一段你的code,那样,找错误比较容易。
      

  4.   

    package cheess;import java.awt.*;
    import java.awt.event.*;
    import java.applet.*;
    public class demo extends Applet {
       protected TextField IpText;
      protected Button ip_button;
      protected String string_ip;
      boolean isStandalone = false;
      public native void greet(int i);
      /**Get a parameter value*/
      public String getParameter(String key, String def) {
        return isStandalone ? System.getProperty(key, def) :
          (getParameter(key) != null ? getParameter(key) : def);
      }
      static{
       try{
      System.loadLibrary("MyHello1");
      }catch(UnsatisfiedLinkError e){
      System.out.println("Load Dll Failed!");
    }
      }
      /**Construct the applet*/
      public demo() {
      }
      /**Initialize the applet*/
      public void init() {
        try {
          jbInit();
          demo ip =new demo();
          ip.greet(10);
    }
        catch(Exception e) {
          e.printStackTrace();
        }
    }
      /**Component initialization*/
      private void jbInit() throws Exception {
        this.setSize(new Dimension(400,300));
      }
      /**Get Applet information*/
      public String getAppletInfo() {
        return "Applet Information";
      }
      /**Get parameter info*/
      public String[][] getParameterInfo() {
        return null;
      }  //static initializer for setting look & feel
      static {
        try {
          //UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
          //UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
        }
        catch(Exception e) {
        }
      }
    }
    这个是我applet的源码,但是首先一点可以肯定,dll是加载成功的.只是不能通过JNI方法来调用DLL中的方法.
      

  5.   

    to xiaoqiushui(笑秋水):
    sendbox(沙箱)我一点概念都没有,可能我只是一个Java的初学者,安全方面的书我会去看看的,但我现在急于要找到一种解决这个问题的方法.
      

  6.   

    这个问题已经与调用dll无关了,因为applet是运行在能够运行在因特网上任何浏览器上的程序,他的安全管理十分严格.想象一下,如果有个网页嵌入了你的applet,某人在浏览网页时这个applet却偷偷的把他存在电脑上的信用卡密码文件打开,然后传到你的机器上.....嘿嘿,你就乐吧你!因此,applet一旦运行他的安全管理器就会阻止你对任何本地文件的操作所以你要调用本地dll,就不能用applet来实现
      

  7.   

    好了,我已经解决了鼠标点击按钮事件通过JNI方法调用本地方法,但又有一个问题出现了,是我在java中定义的 public native long S2I_Link(char[] ip),我把一个char数组的IP地址通过JNI传到C++中,然后在C++中读出IP地址,但无论怎么做都是一段乱码,C++中存IP地址的数据类型是jchararray型的,我把它转换成了char *,因为函数中的参数要求为char *.
    要怎样转换才能保证不是乱码呢?
      

  8.   

    #include "demo.h"
    #include <stdio.h>
    JNIEXPORT jlong JNICALL Java_demo_S2I_1Link
      (JNIEnv *env, jobject obj, jcharArray char_ip)
    {
    const char* szStr = (*env)->GetStringUTFChars(env,char_ip,0 );
    }C:\Documents and Settings\Administrator\jbproject\ip_demo\demo.cpp(14) : error C2819: type 'JNIEnv_' does not have an overloaded member 'operator ->'
    c:\documents and sttings\administrator\jbproject\ip_demo\jni.h746) : see declaration of 'JNIEnv_'
    C:\Documents and Settings\Administrator\jbproject\ip_demo\demo.cpp(14) : error C2227: left of '->GetStringUTFChars' must point to class/struct/union
    Error executing cl.exe.这样也报错?
      

  9.   

    成功了,原来在C++里写的格式是不一样的.  
    #include "demo.h"
    #include <stdio.h>
    JNIEXPORT jlong JNICALL Java_demo_S2I_1Link
      (JNIEnv *env, jobject obj, jcharArray char_ip)
    {
    const char* szStr = env->GetStringUTFChars(char_ip,0);
    }
    我把格式改成这样就正常了,谢谢大家给我的提示.
      

  10.   

    为client定制一个具有applet数字签名的jre,放在服务器端,由客户端访问时下载安装,就可以让你的applet具有访问本地资源的权限了。这种模式已经被实现了。