`

java jni unsatisfiedlinkerror

阅读更多

原文 http://dikar.iteye.com/blog/382701

最近要用到JNI所以先练下手,因为项目是要在linux环境下开发,但是我自己的机子上环境还不全,所以就先用WINDOWS来测试了,其实原理和linux是差不多的。

因为之前有篇文章介绍了linux下的IDE 然后我还是喜欢eclipse 所以还是用的CDT这个插件,不过这次装插件遇到些小麻烦,之前测试装的是2.1.1 装上之后是可以用的,但是现在关了eclipse再启动就报错了,编辑器都打不开(C++的编辑器)。然后去了CDT官方才发现有针对eclipse3.4 的版本,看来我是土了,update site 是:

 

http://download.eclipse.org/tools/cdt/releases/ganymede

 

因为我的eclipse也是ganymede。这下算是装好了但是装的时间有些长,哎网速慢了。

 

接下来就是装什么MinGW ,然后就按照网上的例子写个helloWorld了,就是这么个helloWorld 害我搞一下午。

 

错误1: java.lang.Unsatisfie.lang.UnsatisfiedLinkError  no XXXXX in java.library.path

这个错误一般是找不到dll文件

 

执行下这个 可以看看  System.out.println(System.getProperty("java.library.path"));  其实就是我们设置的path 环境变量里的东西或者有其他系统的设置。(在windows cmd下 输入path 或者 set 都可以看)。看了这个以后你就知道这个dll或者so文件放哪里他是可以找到了,当然最简单的放这个java文件所在的目录了或者他上层目录,一般是和java  src目录同层目录就好了,你看下java.library.path 中有个点号(.) 就表明是当前工作目录的意思,所以肯定在工程目录下有个位置。这个错误一般比较好解决。

 

错误2:java.lang.UnsatisfiedLinkError: XXXclass.XXXmethod()

这个错误是 在这个dll里找不到方法的声明,(搞了一下午害我差点装VC了,还借用到了dll查看工具)

网上说是@符号的问题 ,解决方法是用gcc 编译的时候指定参数

第1种方法:

gcc -Wl,--kill-at -shared -o jnihello.dll Native.c

这种方法生成不带@的函数声明

 

第2种方法:
gcc -Wl,--add-stdcall-alias -shared -o jnihello22.dll Native.c

这种方法会生成2个函数声明,一个是带@的 一个是不带@的。

 

第3种方法:

在你的本地方法的头文件中中的函数前面加上下划线,比如以前是

JNIEXPORT void JNICALL Java_TestNative_Hello (JNIEnv * , jobject );

现在改成

JNIEXPORT void  JNICALL  _Java_TestNative_Hello (JNIEnv * , jobject );

同时你的实现的cpp文件或者c文件里的函数头也要一致 前面有下划线。

 

如果你需要查看dll的导出函数声明可以用以下2个工具

1: dllexp

2:Anywhere PE Viewer

 

声明:转载的话请写转载地址 http://dikar.iteye.com/admin/blogs/382701

        这个解决方案只在windows下测试过 ,linux下同样错误是否适用未知。

 

 

分享到:
评论

相关推荐

    JAVA JNI调用DLL完整步骤

    如果DLL调用失败,Java代码可能会抛出`UnsatisfiedLinkError`。为了调试,可以在C/C++代码中添加日志输出,或者使用Java的`Exception`类抛出更具体的错误信息。 总结,Java调用DLL的完整步骤包括:定义Java的`...

    (最终解决)java.lang.UnsatisfiedLinkError解决尝试

    Java中的`java.lang.UnsatisfiedLinkError`是一个常见的运行时异常,通常出现在Java试图加载本地(C或C++)库但找不到相应的库文件时。这个错误可能是由于多种原因引起的,如库路径设置不正确、库文件不存在或者版本...

    java调用JNI

    Java调用JNI详解 Java Native Interface(JNI)是Java虚拟机(JVM)与native代码之间的接口,允许Java程序调用native代码,反之亦然。本文将详细介绍如何使用Java的JNI调用C++的DLL包。 JNI的作用 JNI的主要作用...

    java的JNI本地调用

    ### Java的JNI本地调用详解 #### 一、简述JNI技术 JNI(Java Native Interface)即Java本地接口,是一项关键技术,它允许Java代码与其他语言(例如C或C++)编写的代码进行交互。通过JNI,Java应用程序能够调用本地...

    Java通过JNI调用C语言的方法[参考].pdf

    C/C++的错误可能在Java层表现为` UnsatisfiedLinkError `。 通过JNI,Java开发者可以利用C/C++的高性能特性,实现对硬件的直接操作,调用系统API,或者利用已有的C/C++库,增强Java应用的功能。同时,这也意味着...

    studio碰到问题:java.lang.UnsatisfiedLinkError解决办法

    Java中的`java.lang.UnsatisfiedLinkError`是一个常见的运行时异常,通常出现在Java试图加载本地(C或C++)库时找不到相应的函数或者方法。在Android开发中,尤其是在使用JNI(Java Native Interface)进行跨语言...

    JNI动态注册 方式

    JNI(Java Native Interface)是Java平台提供的一种标准接口,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都是必要的,比如调用操作系统API、优化性能关键部分或者使用已有的C/C++库。本篇文章将...

    Window系统无法调用OpenCV报错Directory separator should not appear in library name

    Window系统无法调用OpenCV代码报错:java.lang.UnsatisfiedLinkError: Directory separator should not appear in library name: C:\Windows\System32\opencv_java343.dll。出现该问题主要是安装的Windows系统缺乏...

    在Java应用程序中使用JNI来监视CPU详解

    在这种情况下,可以通过JNI(Java Native Interface)与本地代码(如C或C++)交互来实现。JNI允许Java代码调用本地方法,进而访问操作系统特定的功能,如监控CPU使用率。 首先,我们需要在Java类中声明一个JNI方法...

    c++ mk文件出错Jni调用产生java.lang.UnsatisfiedLinkError错误解决方法

    在Android平台上进行JNI(Java Native Interface)开发时,有时会遇到`java.lang.UnsatisfiedLinkError`这样的错误,这通常表明Java程序无法找到对应的本地库方法。本问题中,开发者在将C语言编写的JNI方法转换为C++...

    JNI入门 pdf

    - **示例**:在 Java 代码中使用 `System.loadLibrary` 加载动态库时,如果动态库的名称写错或者根本不存在,程序将抛出 `UnsatisfiedLinkError` 异常。例如,假设库名为 `hello`,但代码中写成 `hell0`。 ```...

    Ubantu tomocat启动报错 no opencv_java249 in java.library.path问题解决方案压缩包

    当启动Tomcat时,如果出现“no opencv_java249 in java.library.path”这样的错误,意味着系统无法找到OpenCV(开源计算机视觉库)的相关JNI(Java Native Interface)库。这个问题通常出现在使用OpenCV的Java项目中...

    JNI入门Demo2.0

    - 注意处理JNI调用中的异常,例如类型不匹配、找不到类或方法等问题,这些通常会导致Java层抛出` UnsatisfiedLinkError`。 8. **性能优化**: - JNI调用比纯Java代码快,因为它直接操作内存,避免了Java的垃圾回收...

    虹软人脸识别 – Android平台调用动态库时的常见错误解析

    最近我们发现很多用户...java.lang.UnsatisfiedLinkError: couldn't find libarcsoft_face_engine.so 原因: 在安装应用时,APK中指定的ABI目录下没有发现指定的动态库,寻找apk中动态库的规则详见 https://developer

    java调用vtk

    这得益于Java Native Interface (JNI),一个允许Java代码调用本地(非Java)代码的框架。VTK的Java接口包含了所有核心类和方法,可以进行数据处理、渲染和交互。 2. **设置开发环境**: 在Eclipse中,首先需要安装...

    jni需要注意的常见问题

    例如,经常遇到的错误为 `java.lang.UnsatisfiedLinkError: no testjni1 in java.library.path`。 **原因分析**: 这类错误通常发生在试图加载一个不存在于 Java 库路径 (`java.library.path`) 中的本地库时。这...

Global site tag (gtag.js) - Google Analytics