当前位置: 首页 > 知识库问答 >
问题:

JNI HellowWorld unsatisfiedlinkError找不到依赖库

钱嘉致
2023-03-14

我尝试了Hello world JNI,来自:

http://home.pacifier.com/~mmead/jni/cs510ajp/

我学习了Java类:

public class ACTICamWrapperJNI {
    public native void displayMessage();
  static 
  {
    System.loadLibrary("HelloWorldImp"); 

}

}

然后打电话进来:

     public static void main(String args[]) {

            //</editor-fold>
    System.out.println(System.getProperty("java.library.path"));

   ACTICamWrapperJNI test = new ACTICamWrapperJNI();
   }

cpp文件如下所示:

#include <stdio.h>
#include "HelloWorld.h"   // this header file was generated by javah
JNIEXPORT void JNICALL Java_HelloWorld_displayMessage(JNIEnv *env, jobject obj) 
{
  printf("Hello World!\n");
}

我已切换到JDK x86并使用x86编译:

C:\Development\testJNI>javac HelloWorld.java

C:\Development\testJNI>javac HelloWorld.java

C:\Development\testJNI>javah -jni HelloWorld

我使用了QT文件夹中的MINGW32的gcc(希望没问题)

C:\Development\testJNI>gcc -shared -I "C:\Program Files (x86)\Java\jdk1.7.0_40\include" -I"C:\Program Files (x86)\Java\jdk1.7.0_40\include\win32" HelloWorld.cpp -o HelloWorldImp.dll

注意:我必须添加共享,否则会出现错误:

 undefined reference to `WinMain@16'

C:\Development\testJNI>"C:\Program Files (x86)\Java\jdk1.7.0_40\bin\java.exe" Main
Exception in thread "main" java.lang.UnsatisfiedLinkError: HelloWorld.displayMessage()V
        at HelloWorld.displayMessage(Native Method)
        at Main.main(Main.java:9)

请注意,我已经确保运行的是x32 jdk的java,并且也使用x32版本进行编译,因为我的系统上也有x64。

在NetBean IDE上也进行了尝试,但遇到了以下问题:

Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\Windows\System32\HelloWorldImp.dll: Can't find dependent libraries
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary1(ClassLoader.java:1957)
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1882)
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1872)
    at java.lang.Runtime.loadLibrary0(Runtime.java:849)
    at java.lang.System.loadLibrary(System.java:1087)
    at au.com.ricor.ACTICamWrapperJNI.<clinit>(ACTICamWrapperJNI.java:15)
    at au.com.ricor.CameraPanel.main(CameraPanel.java:58)

以及我使用的gcc版本是:

C:\Development\testJNI>gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=c:/qt/tools/mingw48_32/bin/../libexec/gcc/i686-w64-mingw32/4
.8.0/lto-wrapper.exe
Target: i686-w64-mingw32
Configured with: ../../../src/gcc-4.8.0/configure --host=i686-w64-mingw32 --buil
d=i686-w64-mingw32 --target=i686-w64-mingw32 --prefix=/mingw32 --with-sysroot=/t
emp/x32-480-posix-dwarf-r2/mingw32 --enable-shared --enable-static --disable-mul
tilib --enable-languages=c,c++,fortran,lto --enable-libstdcxx-time=yes --enable-
threads=posix --enable-libgomp --enable-lto --enable-graphite --enable-checking=
release --enable-fully-dynamic-string --enable-version-specific-runtime-libs --d
isable-sjlj-exceptions --with-dwarf2 --disable-isl-version-check --disable-cloog
-version-check --disable-libstdcxx-pch --disable-libstdcxx-debug --disable-boots
trap --disable-rpath --disable-win32-registry --disable-nls --disable-werror --d
isable-symvers --with-gnu-as --with-gnu-ld --with-arch=i686 --with-tune=generic
--with-host-libstdcxx='-static -lstdc++' --with-libiconv --with-system-zlib --wi
th-gmp=/temp/mingw-prereq/i686-w64-mingw32-static --with-mpfr=/temp/mingw-prereq
/i686-w64-mingw32-static --with-mpc=/temp/mingw-prereq/i686-w64-mingw32-static -
-with-isl=/temp/mingw-prereq/i686-w64-mingw32-static --with-cloog=/temp/mingw-pr
ereq/i686-w64-mingw32-static --enable-cloog-backend=isl --with-pkgversion='rev2,
 Built by MinGW-builds project' --with-bugurl=http://sourceforge.net/projects/mi
ngwbuilds/ CFLAGS='-O2 -pipe -I/temp/x32-480-posix-dwarf-r2/libs/include -I/temp
/mingw-prereq/x32-zlib/include -I/temp/mingw-prereq/i686-w64-mingw32-static/incl
ude' CXXFLAGS='-O2 -pipe -I/temp/x32-480-posix-dwarf-r2/libs/include -I/temp/min
gw-prereq/x32-zlib/include -I/temp/mingw-prereq/i686-w64-mingw32-static/include'
 CPPFLAGS= LDFLAGS='-pipe -L/temp/x32-480-posix-dwarf-r2/libs/lib -L/temp/mingw-
prereq/x32-zlib/lib -L/temp/mingw-prereq/i686-w64-mingw32-static/lib -L/temp/x32
-480-posix-dwarf-r2/mingw32/opt/lib'
Thread model: posix
gcc version 4.8.0 (rev2, Built by MinGW-builds project)

谢啦

威廉

共有2个答案

司马宏茂
2023-03-14

我知道这有一个答案,但我确定如果您编译为Debug,它不能重新分发到另一台PC;您可以尝试编译发布,这应该可以工作。我只是用它来解决我自己的问题。

邹海超
2023-03-14

或者从au重命名该类。通用域名格式。里科。ACTICamWrapperJNI到HelloWorld,或Java\u HelloWorld\u displayMessage()到Java\u au\u com\u ricor\u ACTICamWrapperJNI\u displayMessage()的本机函数(在C文件中)

 类似资料:
  • 我正在使用本机库格式OCR,添加jar并将dll放入progfile\common文件中,尽管我遇到以下错误,请帮助我。。。。 ibrary.load不满意LinkError: C:\Program Files\Common Files:无法找到依赖库java.lang.ClassLoader$NativeLoader.load(Native Method)在oader.java:1751Clas

  • 当我从以下链接运行代码时,https://github.com/sagioto/lipreading/blob/master/lipreading-gui/src/main/java/edu/lipreading/gui/mainframe.java;我得到以下错误: 线程“Thread-6”java.lang.UnsatisfiedLinkError中出现异常:C:\users\harish r

  • 我最近安装了ImageMagick 6.3.9和JMagick 6.3.9。从这里通过和。 我在NetBeans中将添加到我的项目的库中,并将类路径设置为包含安装ImageMagick的文件夹(我还将放在其中)。 这就是我所做的一切。 然而,当我运行我的程序(它只声明一个并初始化它)时,我得到了以下错误: 为什么会这样,我该如何解决?

  • 我和我的朋友正在做一个Java maven项目,它的设置和我们从Git得到的项目是一样的。在我的设置中,Maven正确地导入了所有依赖项,但对于我的朋友,它找不到任何依赖项。 我们尝试过的事情: 右键单击project,单击maven并单击Reimport。 我们都可以上网,所以这也不是问题。而且,Maven在IntelliJ中设置为自动导入。

  • 这是我第一次部署到AWS Lambda,我有点卡住了。 我有一个名为的大型maven项目,它有许多子模块,其中许多相互依赖。在那里,我有一个名为的助手。我有一个父目录,一切都建立和编译成功。所以,那很好。 在Alerts中,有一个名为的类 导入com.mywebsite.messages.实干家 哪里有消息。在依赖项中可以找到实干家。 但是,当我对整个项目执行

  • 即使我尝试了不同版本的《卡桑德拉》,但还是出现了同样的错误。任何修复都将不胜感激 更新: 以上是系统和应用程序版本