标签: unsatisfiedlinkerror

Android NDK UnsatisfiedLinkError - 一个令人惊讶的原因

2013年7月7日更新: 问题现在已经解决,但错误的原因是非常意外的,所有这些错误的常见嫌疑人在开始时都被淘汰了,我学到了一些新东西.请参阅下面的答案.


我非常绝望.有一个带有本机库的Android应用程序,我称之为方法.在我测试的所有系统上都没有问题,并且该程序在Google Play中没有任何问题报告,成千上万的用户使用.现在,HTC One手机显然是新的ROM - Android版本4.2.2.用户声称它是官方版本,从官方频道升级.当他们尝试启动我的应用程序时,它崩溃了,堆栈跟踪说:

java.lang.UnsatisfiedLinkError:找不到本机方法...

我知道的方法名称在那里,并且在他们安装了Android 4.1时在同一台设备上工作得很好.我在Android 4.2.2中在模拟器中测试它(没有这个特定的设备)并且没有问题.此外,用户尝试卸载并重新安装具有相同结果的应用程序.即使向他们发送私人版本,没有任何ProGuard/Dexguard保护也无济于事.

还有什么可以导致Android上的java.lang.UnsatisfiedLinkError?或者我应该假设这个HTC ROM只是错误?有没有其他人在使用Android 4.2.2的HTC One上遇到过类似的问题?

编辑2013年7月24日

在下面的评论中,另一位开发人员建议系统可能在查找我的本机库时遇到麻烦.我通过从设置中完全删除本机库文件来对Genymotion 4.2.2模拟器进行实验.在这种情况下错误信息是不同的,得到:

W/System.err:引起:java.lang.UnsatisfiedLinkError:无法从loader dalvik.system.PathClassLoader加载cld [dexPath =/data/app/com.hyperionics.avar-2.apk,libra ryPath =/data/app-lib/com.hyperionics.avar-2]:findLibrary返回null

在我从HTC One用户使用Android 4.2.2获得的堆栈跟踪消息中,我看到以下错误消息:

引起:java.lang.UnsatisfiedLinkError:找不到本机方法:com.hyperionics.avar.CldWrapper.detectLangNative:(Ljava/lang/String;)[Ljava/lang/String;

对我来说,系统似乎根据需要找到libcld.so文件,但是找不到它需要的方法.为什么???我知道方法就在那里,根据需要导出,而其他所有运行Android 4.2.2的设备和系统都可以找到它.只有带4.2.2的HTC One在那里失败了......

2013年7月25日更新

开始获得50个代表的赏金.因为我没有HTC One而且卡住了.接受一个答案,或者指出解决问题的方法 - 并且回答者将测试我的代码mod.显示它的工作原理 - 或证明这是HTC One最近的Android 4.2.2 ROM中的一个错误.相关应用是https://play.google.com/store/apps/details?id=com.hyperionics.avar

2013年7月31日更新

赏金的最后一天,仍然没有答案,没有建议......到目前为止,所有这些错误报告我来自欧洲,报告的品牌是"htc_europe"或"vodafone_fr".也许这个错误仅限于欧洲(法国+德国)...如果有人将HTC One和Android更新到4.2.2,如果错误发生在其他国家或其他提供商,我会感兴趣.

格雷格

android android-ndk unsatisfiedlinkerror

12
推荐指数
1
解决办法
5589
查看次数

Android studio:UnsatisfiedLinkError:findLibrary返回null - 加载本机库

我在Android Studio中制作了一个使用两个库的应用程序.一个带有Android包装器和jar库的本机库.出于某种原因,如果将其他jar库编译到项目中,则不会加载本机库.因此,如果我只使用本机库运行应用程序,一切正常.我将另一个jar库添加到我的gradle文件并繁荣...一个UnsatisfiedLinkError:

java.lang.UnsatisfiedLinkError: Couldn't load MobileOcrEngine from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.example.app-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.example.app-1, /vendor/lib, /system/lib]]]: findLibrary returned null
Run Code Online (Sandbox Code Playgroud)

我用这个时我的应用运行正常:

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'src/main/jniLibs')
    compile 'com.android.support:support-v13:21.0.2'
    compile project(':wheel')
}
Run Code Online (Sandbox Code Playgroud)

我尝试时发生错误:

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'src/main/jniLibs')
    compile 'com.android.support:support-v13:21.0.2'
    compile project(':wheel')
    compile files('libs/realm-0.78.0.jar')
}
Run Code Online (Sandbox Code Playgroud)

或者当我尝试使用相同的库但使用Maven存储库时:

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'src/main/jniLibs')
    compile 'com.android.support:support-v13:21.0.2'
    compile project(':wheel')
    compile 'io.realm:realm-android:0.78.0'
}
Run Code Online (Sandbox Code Playgroud)

或者如果我尝试将jar放在jniLibs文件夹中:

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'src/main/jniLibs')
    compile 'com.android.support:support-v13:21.0.2'
    compile project(':wheel')
}
Run Code Online (Sandbox Code Playgroud)

我不知道问题的根源在哪里.有两个库中的一个,Android Studio还是我做错了什么?

注意: 我知道StackOverflow上有很多关于UnsatisfiedLinkErrors的问题,但这些都没有为我的问题提供解决方案.如果它是我使用的唯一库,我加载本机库没有问题...

android realm gradle unsatisfiedlinkerror android-studio

11
推荐指数
1
解决办法
1万
查看次数

没有找到void com.unity3d.player.UnityPlayer.nativeRestartActivityIndi​​cator()的实现

我是Unity的新手,我正在尝试将Unity游戏(它有ARcore)集成到原生Android应用程序中.

我能够在一个新的HelloWorld应用程序中启动统一,但无法在我的真实应用程序(具有其他模块)中启动.

注意:当我从Unity项目构建一个android库时,我包括armeabi-v7a和x86架构.

java.lang.UnsatisfiedLinkError中:未找到无效com.unity3d.player.UnityPlayer.nativeRestartActivityIndi​​cator()实现在com.unity3d.player.UnityPlayer(试过Java_com_unity3d_player_UnityPlayer_nativeRestartActivityIndi​​cator和Java_com_unity3d_player_UnityPlayer_nativeRestartActivityIndi​​cator__)在com.unity3d.player.UnityPlayer.nativeRestartActivityIndi​​cator(本机方法) .resume(未知来源:37)com.rccl.soakTest.UnityPlayerActivity.onResume(UnityPlayerActivity.java:58)在android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1361)的android.app.Activity.performResume(活动) .java:7344)在Android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3636)的android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3828)的android.app.ActivityThread.performResumeActivity(ActivityThread.java:3763)在android.app.ActivityThread.-wrap11(未知来源:0)在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1696)atr 在android.app.Looper.loop(Looper.java:164)的oid.os.Handler.dispatchMessage(Handler.java:105)位于android.app.ActivityThread.main(ActivityThread.java:6938)的java.lang.reflect .Method.invoke(Native Method)位于com.android.internal.os.Zygote $ MethodAndArgsCaller.run(Zygote.java:327)com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

在以下设备上测试:SamsungS8(Oreo),Emulator-Nexus 6(Oreo)

android abi unity-game-engine unsatisfiedlinkerror arcore

11
推荐指数
2
解决办法
7102
查看次数

java.lang.UnsatisfiedLinkError:无法在Windows x86机器上的32位JVM上加载64位SWT库

我刚开始使用swt(windows x86_x64兼容版本).当我在Eclipse中运行示例代码片段时,我收到以下错误...

Exception in thread "main" java.lang.UnsatisfiedLinkError: Cannot load 64-bit SWT libraries on 32-bit JVM
 at org.eclipse.swt.internal.Library.loadLibrary(Unknown Source)
 at org.eclipse.swt.internal.Library.loadLibrary(Unknown Source)
 at org.eclipse.swt.internal.C.<clinit>(Unknown Source)
 at org.eclipse.swt.widgets.Display.<clinit>(Unknown Source)
 at Snippets.main
Run Code Online (Sandbox Code Playgroud)

我的机器上有Windows Vista.我相信这个swt版本应该支持32位和64位Os.为了让32位工作,我错过了什么?

如果我的JVM版本错误,我该如何更改?

java eclipse swt windows-vista unsatisfiedlinkerror

10
推荐指数
2
解决办法
3万
查看次数

包括Netbeans中的本地库

我正在尝试从java签名的applet中读取便携式设备....我在http://code.google.com/p/jmtp/w/list上找到了一个jmtp库 来访问便携式设备,但是当我运行它时netbeans它给出了错误

    Exception in thread "main" java.lang.UnsatisfiedLinkError: no jmtp in java.library.path
        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860)
        at java.lang.Runtime.loadLibrary0(Runtime.java:845)
        at java.lang.System.loadLibrary(System.java:1084)
        at jmtp.PortableDeviceManagerImplWin32.(PortableDeviceManagerImplWin32.java:38)
        at jmtp.PortableDeviceManager.(PortableDeviceManager.java:34)
        at jmtp.Jmtp.main(Jmtp.java:23)
    Java Result: 1
    

我搜索并发现我必须在.jmtp项目中包含.dll文件作为本机库...我右键单击项目并导航到属性,然后选择"运行"和选择的VM选项为

-Djava.library.path="c:\jmtp\native\windows"
并将该jmtp.dll文件放在c:\ jmtp文件夹中

但是我的代码不断出现同样的错误

    package jmtp;

import jmtp.PortableDevice;
import jmtp.PortableDeviceManager;
import jmtp.PortableDeviceObject;
import jmtp.PortableDeviceStorageObject;

public class Jmtp {

    public static void main(String[] args) {
        PortableDeviceManager manager = new PortableDeviceManager();
        PortableDevice device = manager.getDevices()[0]; 

        // Connect to my mp3-player
        device.open();
        System.out.println(device.getModel());
        System.out.println("---------------");

        // Iterate over deviceObjects
        for(PortableDeviceObject object : device.getRootObjects()) {

            // …
Run Code Online (Sandbox Code Playgroud)

java wpd netbeans-7 java.library.path unsatisfiedlinkerror

10
推荐指数
2
解决办法
3万
查看次数

为什么我从Market获得java.lang.UnsatisfiedLinkError的报告

我在Android市场上有一个应用程序,在崩溃报告中我得到java.lang.UnsatisfiedLinkError崩溃,每次它都是针对不同的.so文件.

错误看起来像

java.lang.ExceptionInInitializerError
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.UnsatisfiedLinkError: Couldn't load *****: findLibrary returned null
Run Code Online (Sandbox Code Playgroud)

要么

java.lang.ExceptionInInitializerError
at java.lang.Thread.run(Thread.java:1019)
Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: alloc_mem_region[871]: OOPS: 116 cannot map library ********. no vspace available.
Run Code Online (Sandbox Code Playgroud)

要么

java.lang.UnsatisfiedLinkError: Couldn't load ******: findLibrary returned null
at java.lang.Runtime.loadLibrary(Runtime.java:429)
at java.lang.System.loadLibrary(System.java:554)
Run Code Online (Sandbox Code Playgroud)

看起来有些设备找不到一些.so文件..崩溃不适用于任何特定的.so文件.我的应用程序中有大约4个.so文件,有时它崩溃为1,有时它会崩溃另一个.

我在测试时无法重现这个问题,尽管我测试了几乎所有版本的Android ...

任何指针都将受到高度赞赏

谢谢

crash android report unsatisfiedlinkerror google-play

9
推荐指数
2
解决办法
1671
查看次数

本机库(.so文件)不会添加到android项目中

我正在尝试使用需要使用本机库的sqlitecipher库.他们的教程非常简单,但对我来说不起作用.每次我收到以下错误:

FATAL EXCEPTION: main
        java.lang.UnsatisfiedLinkError: Couldn't load stlport_shared from loader dalvik.system.PathClassLoader[dexPath=/data/app/org.example.test-2.apk,libraryPath=/data/app-lib/org.example.test-2]: findLibrary returned null
        at java.lang.Runtime.loadLibrary(Runtime.java:365)
        at java.lang.System.loadLibrary(System.java:535)
        at net.sqlcipher.database.SQLiteDatabase.loadLibs(SQLiteDatabase.java:141)
        at net.sqlcipher.database.SQLiteDatabase.loadLibs(SQLiteDatabase.java:136)
Run Code Online (Sandbox Code Playgroud)

它意味着.so文件在编译期间没有附加.

所有3个文件都存储在/ libs/armeabi /目录中.

我认为问题在于我使用maven来管理依赖项(无论如何都要使用Android Studio进行构建).下一次尝试 - 将这些库包含在maven依赖项中.根据文档,这很容易.我在公共存储库中找不到它们,所以我使用<scope>system</scope> 了标签.它们是可见的,但它不起作用.后来发现这个链接,据说范围"系统"不起作用,尝试将这些库添加到本地存储库中使用

mvn install:install-file -DgroupId=net.sqlitecipher -DartifactId=stlport_shared -Dversion=1.0 -Dfile=libstlport_shared.so -Dpackaging=so -DgeneratePom=true
Run Code Online (Sandbox Code Playgroud)

最后 - 它没有用.

我也看到了这个话题,可能这是一个解决方案,但我目前不使用gradle.有没有办法将.so文件包含到apk中,而无需从maven转移到gradle?

据我所知,Android Studio在内部使用gradle来构建apks,所以我对maven的所有努力都没用,直到他们开始支持本机库,我是对的吗?我还尝试用Intellij IDEA Cardea(13.0)构建项目,遗憾的是没有任何成功.

android intellij-idea maven unsatisfiedlinkerror android-studio

9
推荐指数
1
解决办法
9109
查看次数

OpenJDK 8中ImageIO.read错误的解决方法?

我正在使用Java 8(特别是OpenJDK 8)进行项目,我需要从JPG文件中读取图像.一开始搜索到了一些类似的问题(例如,将字节数组读入没有ImageIO的缓冲图像,是否有100%的Java替代ImageIO来读取JPEG文件?),但我的问题不同,那里的解决方案不符合我的要求要求.

事实证明,JPEGImageReader班级仍然缺失.(请参阅openjdk-8:libjavajpeg.so中缺少JPEGImageReader函数)虽然该错误报告是针对Debian的,但我使用的是Kubuntu 14.10,它也受到了影响.

根据该报告的最后一条消息,此时似乎没有人正在处理这个问题......

重现此错误的代码段是:

// ...
BufferedImage img = null;
try {
    img = ImageIO.read(new File(filename));
} catch (IOException e) {
    throw new RuntimeException(e);
}
// ...
Run Code Online (Sandbox Code Playgroud)

该文件的路径是有效的,如果我使用Java 1.7,这将正常工作,但更改为1.8会导致以下激活ImageIO.read:

Caught UnsatisfiedLinkError: com.sun.imageio.plugins.jpeg.JPEGImageReader.initReaderIDs(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/Class;)
Run Code Online (Sandbox Code Playgroud)

我想帮助解决这个问题,同时避免:

  1. 其他/外部库的附加依赖;
  2. 回到Java 1.7;
  3. 不得不从源头重建;
  4. Oracle专有的JDK实现

工作代码片段表示赞赏.

编辑1:在列表中添加了第4点.

EDIT-2:重新编写主要部分的一部分并添加了另一个参考.

java openjdk image unsatisfiedlinkerror

9
推荐指数
1
解决办法
3719
查看次数

System.loadLibrary不起作用.链中第二个lib的UnsatisfiedLinkError

我有java程序Client.class,它通过JNI使用cpp共享库libclient.so.libclient.so构建为共享并使用cpp共享库libhttp.so.

libclient.so和libhttp.so放在/home/client/lib64
Client.class 文件夹中/home/client/bin

客户端可以加载库

  1. System.load和环境变量LD_LIBRARY_PATH
  2. System.loadLibrary和-Djava.library.path

第一种方式很好.

export LD_LIBRARY_PATH = /home/client/lib64

java -classpath ./bin客户端

secon方式失败了.

java -classpath ./bin -Djava.library.path=./../lib64 Client

java.lang.UnsatisfiedLinkError: /home/client/lib64/libclient.so: libhttp.so: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)

当我将libhttp.so放入/ usr/lib64时,第二种方式正常.

如果我使用System.loadLibrary,为什么libclient.so在/ usr/lib64中寻找libhttp.so?如何在不将libhttp.so复制到/ usr/lib64的情况下修复它?

我的加载代码:

    //Try load from -Djava.library.path        
    boolean found = false;
    String lib = "client";
    try {
       System.loadLibrary(lib);
       found = true;
    } catch (UnsatisfiedLinkError e) {
       e.printStackTrace();
    }
    //Try load from LD_LIBRARY_PATH
    if (!found) {
       lib = "libclient.so";
       String ld_lib_path = …
Run Code Online (Sandbox Code Playgroud)

java java-native-interface loadlibrary java.library.path unsatisfiedlinkerror

8
推荐指数
1
解决办法
2万
查看次数

android .so文件未在/ data/data/<package>/lib中解压缩

我正在开发一个原生的android应用程序,并使用一个生成.so文件的开源库.面对一个奇怪的行为.在最初的几次,应用程序运行得非常好,库已加载.但现在它无法找到图书馆并给出 -

java.lang.UnsatisfiedLinkError:无法加载:findLibrary返回null

.Below很少观察:1.当我提取.apk文件时,库(.so)出现在"lib/armeabi"文件夹下.2.但是当我尝试搜索库(.so)进入设备提取路径时

/ data/data // lib /,它不存在.有关为什么会发生这种奇怪行为以及为什么.so文件未在/data/data/com.ibm.homeScreen/lib/文件夹中解压缩的任何建议.

提前致谢!

android unsatisfiedlinkerror android-native-library

8
推荐指数
1
解决办法
3615
查看次数