java.lang.UnsatisfiedLinkError: Abc.greetings()V

java.lang.UnsatisfiedLinkError: Abc.greetings()V

本文关键字:greetings Abc lang UnsatisfiedLinkError java      更新时间:2023-10-16

在我的java代码中,我需要调用.dll库中的方法

我已经尝试了很多,使用 jna 和使用 System.loadLIbraray((。 首先,我创建如下所示的java,编译后我使用javah生成了头文件Abc.h。

我放置了Abc.h是我的视觉工作室项目,并创建了一个cpp文件 然后我构建创建.dll文件的项目

public class Abc {
      public native void greetings();
       static {
         System.loadLibrary("ClassLibrary1");
         System.out.println("library loaded");
       }
      public static void main(String args[])
       {      Abc abc = new Abc();
            abc.greetings();
        }
       }

阿布克·

      /* DO NOT EDIT THIS FILE - it is machine generated */
      #include <jni.h>
      /* Header for class Abc */
      #ifndef _Included_Abc
      #define _Included_Abc
      #ifdef __cplusplus
      extern "C" {
      #endif
      JNIEXPORT void JNICALL Java_Abc_greetings  (JNIEnv *, jobject);
      #ifdef __cplusplus
      }
      #endif
      #endif

ABC.cpp

      #include "Abc.h"
      #include <stdio.h>
       JNIEXPORT void JNICALL Java_Abc_greetings(JNIEnv *env,jobject jobj) {   
        printf("Hello from Visual C++!");
      }

当我运行java程序时,它给出错误

java.lang.UnsatisfiedLinkError: abc.greetings((V

请帮助我解决这个问题

我有点困惑。printf调用是您自己编辑的?因为 JNI 样板代码是自动生成的,所以不应该存在。JNI 正在通过接口查找它找不到的已知函数greetings()。因此是例外。此函数需要存在于C++库中的某个位置。

JNI 样板代码如下所示:

通过Java调用的本机函数:

public static void helloWorldJNI()
{
    helloWorld();
}
private static native void helloWorld();

相应的本机代码 .h/.cpp:

static void helloWorld();
void somenamespace::UtilitiesNative::helloWorld()
{
    LOG_DEBUG << "[JNI HELLO WORLD]";
}

自动生成的 JNI 样板,您不编辑以下内容:

JNIEXPORT void JNICALL Java_data_jni_UtilitiesNative_helloWorld(JNIEnv* env, jclass cls) {
    jthrowable exc = NULL;
    try {
        somenamespace::UtilitiesNative::helloWorld();
    } catch (...) {
        exc = JavaCPP_handleException(env, 19);
    }
    if (exc != NULL) {
        env->Throw(exc);
    }
}

请注意,后者不是我自己写的,而是由JNI生成的。另请注意,它会检查数据,然后从自动生成的方法访问helloWorld()

经过如此多的调查,我发现了编译步骤的问题。 当我使用基本的cl(clang(编译器编译并生成dll时。它工作正常。

cl "abc.cpp" -I"C:\Program Files (x86(\Java\jdk1.8.0_212\include" -I"C:\Program Files (x86(\Java\jdk1.8.0_212\include\win32" -FeClassLibrary1.dll -MD -LD