Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 错过一步?loadLibrary()的参数中需要填写什么_Java_C_Java Native Interface - Fatal编程技术网

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

Java 错过一步?loadLibrary()的参数中需要填写什么,java,c,java-native-interface,Java,C,Java Native Interface,这些是我从java程序调用本机函数所遵循的不完整步骤 编写了一个java程序,然后编译成.class文件 从命令javah-jni中,我生成了一个与.class文件同名的头文件 之后,我打开了一个 C++ VisualExpress ,启动了一个新的项目,并将我的应用程序类型设置为 DLL 这是调用本机c方法的java程序 class HelloWorld { private native void print(); public static void main( String args

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

  • 编写了一个java程序,然后编译成
    .class
    文件
  • 从命令
    javah-jni
    中,我生成了一个与
    .class
    文件同名的头文件
  • 之后,我打开了一个<微软> C++ VisualExpress <强>,启动了一个新的项目,并将我的应用程序类型设置为<代码> DLL
  • 这是调用本机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;
    }
    
    #包括
    #包括
    #包括“HelloWorld.h”
    JNIEXPORT void JNICALL
    Java_HelloWorld_打印(JNIEnv*env,jobject obj){
    printf(“你好,世界!\n”);
    返回;
    }
    
    我将项目名称保留为
    jni-tester
    ,c文件名为
    HelloWorld.c

    在语句
    System.loadLibrary(??)
    中,参数中的库名称应该是什么?(或者在填充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部分。]

    库名称是DLL文件的名称,而不带.DLL扩展名。DLL必须位于要加载的windows PATH环境变量的目录之一。

    传递库的名称。您可以省略.dll扩展名,也可以将其包括在内

    如果只指定一个不包含路径组件的文件名,则库搜索路径将用于搜索库


    或者,您可能更愿意指定可以执行的文件的完整路径。后一种方法通常更可取,因为它允许您精确控制库的加载位置。

    您是指项目名称吗?我不确定在系统路径目录中删除正在开发的DLL是否是一种好做法。在开发过程中,您可以设置路径,使其包含生成DLL的目录。一旦进入生产环境,您就可以在已知路径中的某个目录中部署DLL。您可以这样做,但不建议这样做。