java - 将 native 库添加到 java 项目导致链接不满足要求

标签 java eclipse dll java-native-interface

当我尝试添加 .dll 来构建 java 项目的路径时,我不断遇到错误。 我使用以下命令使用 mingw64 创建了 .dll 文件:

gcc -o ctest.dll -shared -I"C:\Program Files\Java\jdk1.8.0_45\include" 
-I"C:\Program Files\Java\jdk1.8.0_45\include\win32" ctest.c -LC -m64

创建的.dll文件与使用该dll的主类位于同一目录中。

bin/com/jni

我尝试通过执行以下步骤将 .ddl 从 Eclipse 包含到 java 项目:

  • BuildPath -> native 库位置 -> path_to_directory_with_.dll

结果是:

Exception in thread "main" java.lang.UnsatisfiedLinkError: com.jni.HelloWorld.helloFromC()V
    at com.jni.HelloWorld.helloFromC(Native Method)
    at com.jni.HelloWorld.main(HelloWorld.java:14)

由于上述方法不起作用,我尝试从命令行运行该应用程序:

C:\Users\Z003DP9F\java-8 workspace\workspace\JNI_Test\bin>java 
-Djava.library.path="C:\Users\Z003DP9F\java-8 workspace\workspace\JNI_Test\bin\com\jni" 
com.jni.HelloWorld

同样的错误,尽管是在第 12 行而不是上面示例中的第 14 行。

   Exception in thread "main" java.lang.UnsatisfiedLinkError: com.jni.HelloWorld.helloFromC()V
            at com.jni.HelloWorld.helloFromC(Native Method)
            at com.jni.HelloWorld.main(HelloWorld.java:12)

c文件:

#include <jni.h>
#include <stdio.h>

JNIEXPORT void JNICALL Java_HelloWorld_helloFromC
  (JNIEnv * env, jobject jobj)
{
    printf("Hello from C!\n");
}

Java主类:

package com.jni;

public class HelloWorld {
    native void helloFromC(); /* (1) */
    static {
        
        System.loadLibrary("ctest"); /* (2) */
        
    }
    static public void main(String argv[]) {
        HelloWorld helloWorld = new HelloWorld();
        helloWorld.helloFromC(); /* (3) */
    }
}

我一直在尝试设置的示例已采用以下形式:

jni

最佳答案

签名错误;您可以使用 javah 为您获取签名,但就您而言,它只是

JNIEXPORT void JNICALL Java_com_jni_HelloWorld_helloFromC(JNIEnv * env, jobject thiz)

关于java - 将 native 库添加到 java 项目导致链接不满足要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33641995/

相关文章:

java - 当自动缩进打开时,如何避免 Eclipse 创建 2 行?

c - 使用 VS2010 构建的可执行文件在 System32 中找不到 DLL

Delphi如何使用typedef void *参数调用C++ dll函数?

java - Java 8 中 try-with-resources block 中的锁风险

eclipse - 使用 Maven 和 Tomcat 将 servlet 文件放入 Eclipse 的最佳方法是什么?

java - 错误:SSL peer shut down incorrectly

java - 是否可以在 Eclipse 中跟踪资源只读属性?

c++ - 在控制台中创建dll的方法

java - 来自某些目录的 Jar 文件 "cannot find main class",适用于其他目录

java - 在 Android 项目中使用 Gradle 覆盖具有相同包的类