错过了一步?什么需要填写loadLibrary()的参数

时间:2011-08-28 15:53:49

标签: java c java-native-interface

这些是我从java程序调用本机函数时所遵循的不完整步骤。

  1. 写了一个java程序,然后编译成.class文件
  2. 从命令javah - jni我生成了一个与.class文件同名的头文件。
  3. 之后我打开了 Microsoft Visual C ++ Express ,启动了一个新项目并将我的应用程序类型设置为dll
  4. 这是调用本机c方法的java程序。

    class HelloWorld {
    
    private native void print();
    
    public static void main( String args[] ) {
      new HelloWorld().print();
    }
    
    static {
      System.loadLibrary("??"); // what should i write here ?
    }
    

    }

    这是c程序

    #include <jni.h>
    #include <stdio.h>
    #include "HelloWorld.h"
    
    JNIEXPORT void JNICALL 
    Java_HelloWorld_print( JNIEnv *env , jobject obj) {
      printf("Hello World!\n");
      return;
    }
    

    我将项目名称保留为jni tester,c文件名为HelloWorld.c

    在语句System.loadLibrary(??)参数中库的名称应该是什么? (或者在填写loadLibrary的参数之前,我是否缺少任何步骤)

    如果是这样,我错过了什么?

3 个答案:

答案 0 :(得分:5)

从该功能的文档中 System.loadLibrary

  

<强>参数:

     

libname - 库的名称。

您将DLL的名称传递给它。 (也就是说,没有.dll扩展名的DLL的文件名。在类Unix系统上,它将是没有lib前缀或.so(或.o的共享对象名称。对于某些平台)扩展。)

确保您的JVM可以在其库路径中找到DLL。要更改库路径,可以使用java.library.path系统属性,如下所示:

java -Djava.library.path=directory_where_your_dll_resides ...

[执行此操作并从库名称中删除扩展名使代码的java端尽可能地保持可移植性。您将能够按原样将其移动到另一个平台,只需要为该目标重建JNI部分。]

答案 1 :(得分:4)

库名是DLL文件的名称,没有.dll扩展名。 DLL必须位于要加载的Windows PATH环境变量的其中一个目录中。

答案 2 :(得分:2)

传递库的名称。您可以省略.dll扩展名,也可以包含它。

如果只指定一个没有路径组件的文件名,则库搜索路径将用于搜索库。

或者,您可能更喜欢指定文件的完整路径,您可以这样做。后一种方法通常更受欢迎,因为它允许您精确控制库的加载位置。