如果有PACKAGE的话DLL文件应该放在PACKAGE上一层目录,也就是和PACKAGE同一级目录下!

解决方案 »

  1.   

    dll应该放在系统的PATH路径之下,和包名没有关系的。安全起见可以直接放在system32目录
      

  2.   

    pengji(彭乃超) 
    我试过了,可以找到soft_cert_proxy.dll,但是不能调用里面的本地方法Crypt_Get_Version_Proxy(byte[])。
    放在package下时:
    Exception in thread "main" java.lang.UnsatisfiedLinkError: no soft_cert_proxy in java.library.path放在package上一层目录时:
    Exception in thread "main" java.lang.UnsatisfiedLinkError: Crypt_Get_Version_Proxychdw(米) 放在system32下也没用
    Exception in thread "main" java.lang.UnsatisfiedLinkError: Crypt_Get_Version_Proxy
    是不能调用这个本地方法
      

  3.   

    如果在本机调用,需要加环境变量LD_LIBRARY_PATH, 使它指向动态库的路径。
    如果打包,需要改动本机的虚拟机存取权限。
      

  4.   

    如果说no soft_cert_proxy in java.library.path表示没有找到dll文件java.lang.UnsatisfiedLinkError: Crypt_Get_Version_Proxy表示没有找到方法说明,注意:如果你更改了包名你的函数名也必须跟随改动,可以通过javah重新生成.h文件
      

  5.   

    chdw(米) 我如果只是改了package的名字,好像javah后.h文件不会改变的idpmud(泥潭) 可不可以说详细点,最好能举个小例子,谢了!
      

  6.   

    idpmud(泥潭) 我只是给调用jni的.java加了package,这也要涉及到jvm的存取权限?
      

  7.   

    那我在jbuilder下调用本地方法错误也是这种,原来和package有关,我来试试看
      

  8.   

    打包对于jni是没有影响的,只要你设置了,unix系
    LD_LIBRARY_PATH = $jni
    export LD_LIBRARY_PATH
    $/userhome/sh .profile
    win系,添加同样的环境变量。
    你打包的jar文件只要包含你的java class就可以了,而dll需要单独的拷贝。关于jvm的存取权限我把你的需求理解错了。
      

  9.   

    你错了,函数名称的组成规则
    如果包名为a.b
    类名 CC
    方法为 Meth
    Java_a_b_CC_Meth才是需要的名字,否则JVM根本无法区分在不同的类的同一个函数名称所对应的C入口
      

  10.   

    idpmud(泥潭) 你是说添加一个 LD_LIBRARY_PATH的环境变量?应该指向哪里?chdw(米) 我的路径已经很清楚了,import demo;错误是:
    Exception in thread "main" java.lang.UnsatisfiedLinkError: Crypt_Get_Version_Proxy
            at demo.softCertProxy.Crypt_Get_Version_Proxy(Native Method)
            at demo.softCertProxy.Crypt_Get_Version_Java(softCertProxy.java:105)
            at packageTest.A.main(A.java:11)
    很清楚已经指向了 demo.softCertProxy.Crypt_Get_Version_Proxy
      

  11.   

    你的java程序肯定没有错啦,但是关键是dll的入口名称是有一个统一规范的定义的,
    有可能是你没有写对,因为你改变了包名,这个C写的函数名称必须跟随改变
      

  12.   

    那你看看这个有什么问题
    package demo;
    public class softCertProxy
    {
    private native int Crypt_Get_Version_Proxy(byte[] version); static
    {
    try
    {
    System.loadLibrary("soft_cert_proxy");
    }
    catch(SecurityException e)
    {
    System.err.println("security failed "+e);
    }
    } public int Crypt_Get_Version_Java(byte[] version)
    {
    if (Crypt_Get_Version_Proxy(version) ==0)
    {
    System.out.println("The currently version is "+new String(version)); return 0;
    }
    else
    System.out.println("Get version failed"); return 1;
    }
    }#include <stdio.h>
    #include <windows.h>
    #include "softCertProxy.h"
    //#include "CaCrypt.h"typedef UINT (CALLBACK* CRYPT_GET_VERSION_DLL)(char *);JNIEXPORT jint JNICALL Java_softCertProxy_Crypt_1Get_1Version_1Proxy
      (JNIEnv * jEnv, jobject this, jbyteArray version)
      {
      HINSTANCE hDLL;
      CRYPT_GET_VERSION_DLL Crypt_Get_Version_Dll;
      int flag =1;
      
      hDLL =LoadLibrary("soft_cert");
      Crypt_Get_Version_Dll =(CRYPT_GET_VERSION_DLL)GetProcAddress(hDLL,"Crypt_Get_Version");
      if (!Crypt_Get_Version_Dll)
      {
    // handle the error
    FreeLibrary(hDLL); 
    printf("dll link failed\n");
    return flag;
      }
      else
      {
    jboolean* Version; Version =(*jEnv)->GetByteArrayElements(jEnv,version,0);
    // call the function
    if(Crypt_Get_Version_Dll(Version) ==0)
    {
    flag =0;
    (*jEnv)->ReleaseByteArrayElements(jEnv,version,Version,0);
    } return flag;
      }
      }C写的函数什么地方有包的名字信息?
      

  13.   

    Java_softCertProxy_Crypt_1Get_1Version_1Proxy函数为:package : softCertProxy.Crypt.1Get
    class : 1Version
    Function : 1Proxy注意:在JNI中不可以随便加下划线的。
           现在的话函数名和class,package的命名也不对了。
           (不可以用数字开头)。
      

  14.   

    加package执行javah后,.h文件都没有改变,.c文件的方法名需要什么改变?
      

  15.   

    verybigbug() 
    * Class:     softCertProxy
     * Method:    Crypt_Get_Version_Proxy
     * Signature: ([B)I
     */
    JNIEXPORT jint JNICALL Java_softCertProxy_Crypt_1Get_1Version_1Proxy
      (JNIEnv *, jobject, jbyteArray);
    这是javah后自动生成的.h文件,数字是他自己加上的
      

  16.   

    我估计是你没有先编译出.class才运行.h
    应该是
    JNIEXPORT jint JNICALL Java_demo_softCertProxy_Crypt_1Get_1Version_1Proxy
      (JNIEnv *, jobject, jbyteArray);
    才是正确的函数入口
      

  17.   

    如果你用JBuilder写程序的话,只要右键点击Java文件在Properties中的Build页中,在Generate JNI header file中打上勾。再直接make一下这个文件.h文件马上就会生成的,而且应该就是正确的.h文件
      

  18.   

    我的Build页面中也没有Generate JNI header file这个选项,
    如果用javah除了-jni还有什么参数需要用的?
    我自己加上demo后可以了,谢谢你,结帖时给分你^_^
    我现在就想知道如何让java自己来加上package
      

  19.   

    你用的是JBuilder多少版本?5.0就肯定有啦。是右键点击Java文件在Properties中的Build页,不是Project Properties的