java.lang.UnsatisfiedLinkError: Abc.greetings()V
java.lang.UnsatisfiedLinkError: Abc.greetings()V
在我的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
- "ABC" 和 "ABC" ) 在C++中有什么区别?
- JavaCPP 错误:无法将参数"1"的"char*"转换为"Abc*
- C++的纯ABC需要虚拟吗?
- C++ DLL 运行时错误"abc.dll is not a valid WIN32 application" 。请帮助解决这个问题
- 检查特定目录中是否存在与文件匹配的 abc* 的最佳方法
- 从不可复制派生 AbstractBaseClasses (ABC) 是否有缺点?
- 在 CPP 中使用正则表达式将密码("ABC")子句屏蔽为密码("****")
- 对函数'abc'的未定义引用
- Paths.get( "abc/def.jpg" ) 在 C 和 C++ 中获取与操作系统无关的路径的等价物是什么?
- java.lang.UnsatisfiedLinkError: Abc.greetings()V
- 切换语句不起作用 c++ 和 D:\c++ dev-c\Makefile.win 目标"abc.o"的配方失败
- int (abc)(int,int) 是什么意思
- 兼容的声明 __attribute__ ((节( ".abc.dfe" ))) 常量易失性 uint8 属性变量 = 0;- 符合MISRA标准
- 输入字母f或任何字母,并像ABC ABCD ABCDE ABCDEF一样cout字母模式,但仅在我按0时起作用
- 如何/是否有可能有一个载体<unique_ptr<ABC>>?
- 库特 << 2[ "abc" ] << endl;为什么它有效?这是哪种语法?
- 将 (*abc) + 15 未定义,因为数组只有 10 个字符长
- "abc" [0] 不是编译时常量
- 为什么要在c++程序中创建abc.h和abc.cpp文件
- 子类化字符串流提供"0x401bad ABC"而不是"Foo ABC"