最近要用到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中的`java.lang.UnsatisfiedLinkError`是一个常见的运行时异常,通常出现在Java试图加载本地(C或C++)库但找不到相应的库文件时。这个错误可能是由于多种原因引起的,如库路径设置不正确、库文件不存在或者版本...
问题 之前tomcat启动老是报错,虽然不影响项目的启动运行,但是有强迫症的程序员会心里不爽: 如下: 问题分析 由于本机安装的jdk版本与tomcat中使用的jdk版本不一致导致的。 解决方法 后面我把原先tomcat启动环境...
Java中的`java.lang.UnsatisfiedLinkError`是一个常见的运行时异常,通常出现在Java试图加载本地(C或C++)库时找不到相应的函数或者方法。在Android开发中,尤其是在使用JNI(Java Native Interface)进行跨语言...
最近我们发现很多用户...java.lang.UnsatisfiedLinkError: couldn't find libarcsoft_face_engine.so 原因: 在安装应用时,APK中指定的ABI目录下没有发现指定的动态库,寻找apk中动态库的规则详见 https://developer
Java调用JNI详解 Java Native Interface(JNI)是Java虚拟机(JVM)与native代码之间的接口,允许Java程序调用native代码,反之亦然。本文将详细介绍如何使用Java的JNI调用C++的DLL包。 JNI的作用 JNI的主要作用...
在Android平台上进行JNI(Java Native Interface)开发时,有时会遇到`java.lang.UnsatisfiedLinkError`这样的错误,这通常表明Java程序无法找到对应的本地库方法。本问题中,开发者在将C语言编写的JNI方法转换为C++...
在描述中提到的“5.0的手机上报java.lang.UnsatisfiedLinkError异常”,这是Android应用程序在尝试加载本地库时,如果找不到对应的.so文件,就会抛出这个异常。在Android 5.0(API级别21)及更高版本,系统开始支持...
Window系统无法调用OpenCV代码报错:java.lang.UnsatisfiedLinkError: Directory separator should not appear in library name: C:\Windows\System32\opencv_java343.dll。出现该问题主要是安装的Windows系统缺乏...
这得益于Java Native Interface (JNI),一个允许Java代码调用本地(非Java)代码的框架。VTK的Java接口包含了所有核心类和方法,可以进行数据处理、渲染和交互。 2. **设置开发环境**: 在Eclipse中,首先需要安装...
超图许可配置程序
这个库文件是C或C++编写的原生代码,通过JNI(Java Native Interface)与Java层进行交互,为Android应用提供访问底层串口硬件的能力。 1. **Android串口驱动原理** Android系统基于Linux内核,因此其串口驱动也...
注意:您需要确保android:targetSdkVersion =“ 22”,如果targetSdkVersion高于22,则LibVLC:无法加载vlcjni库:java.lang.UnsatisfiedLinkError:dlopen失败:/lib/arm/libvlcjni.so:具有文本重定位
"Nacos启动异常"是一个常见的问题,这里出现的具体异常是`java.lang.UnsatisfiedLinkError`,它通常发生在试图加载本地(C/C++)库时找不到相应的库文件。在给出的描述中,异常信息指出"librocksdbjni91"未能被正确...
本文将详细介绍Jacob库的使用方法以及如何解决常见的“java.lang.UnsatisfiedLinkError”异常。 1. Jacob库介绍 Jacob库是Java与COM组件之间的桥梁,它提供了Java Native Interface (JNI) 来实现这个功能。通过...
在Android平台上,Java Native Access (JNA) 是一个强大的库,允许Java代码直接调用本机库(.so 文件)中的函数,而无需编写复杂的JNI(Java Native Interface)代码。这个"android JNA 依赖jar 包"包含了开发...
java.lang.UnsatisfiedLinkError: Couldn't load stlport_shared from loader dalvik.system.PathClassLoader: findLibrary returned null at java.lang.Runtime.loadLibrary(Runtime.java:365) at java.lang....
Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码无需编写本地代码(如JNI)就能直接调用本机库函数。JNA提供了更简洁、更易用的方式来实现Java与C/C++等本地代码之间的交互,极大地简化了跨语言...