GVKun编程网logo

android – UnsatisfiedLinkError:dlopen失败:无法找到引用的符号“__aeabi_memcpy4”

1

在这篇文章中,我们将为您详细介绍android–UnsatisfiedLinkError:dlopen失败:无法找到引用的符号“__aeabi_memcpy4”的内容。此外,我们还会涉及一些关于And

在这篇文章中,我们将为您详细介绍android – UnsatisfiedLinkError:dlopen失败:无法找到引用的符号“__aeabi_memcpy4”的内容。此外,我们还会涉及一些关于Android NDK UnsatisfiedLinkError – 一个令人惊讶的原因、Android NDK UnsatisfiedLinkError:“dlopen失败:空/丢失DT_HASH”、Android NDK项目:java.lang.UnsatisfiedLinkError:dalvik.system.PathClassLoader、Android ReactNative java.lang.UnsatisfiedLinkError:可以找到要加载的DSO:libreactnativejni.so的知识,以帮助您更全面地了解这个主题。

本文目录一览:

android – UnsatisfiedLinkError:dlopen失败:无法找到引用的符号“__aeabi_memcpy4”

android – UnsatisfiedLinkError:dlopen失败:无法找到引用的符号“__aeabi_memcpy4”

我刚刚从NDK 12.x更新到13.x,现在我遇到了以下崩溃:

Caused by: java.lang.UnsatisfiedLinkError: dlopen Failed: cannot locate symbol "__aeabi_memcpy4" referenced by "/data/app/com.app.myapp-1/lib/arm/libJniBitmapOperationsLibrary.so"...
  at java.lang.Runtime.loadLibrary(Runtime.java:372)
  at java.lang.System.loadLibrary(System.java:1076)
  at com.jni.bitmap_operations.JniBitmapHolder.<clinit>(JniBitmapHolder.java:11)
  <...>

我正在使用的库是here.

我在SO上看到了一些类似的问题,无法找到符号,所有建议都围绕在Application.mk文件中设置APP_PLATFORM.我的JNI库是SDK的一部分,所以我没有Application.mk文件 – 只有Android.mk.我的目标/分钟sdk最近没有变化.我的Android.mk文件是从库中复制的,如下所示:

LOCAL_PATH := $(call my-dir)

#bitmap operations module
include $(CLEAR_VARS)

LOCAL_MODULE    := JniBitmapOperationsLibrary
LOCAL_SRC_FILES := JniBitmapOperationsLibrary.cpp
LOCAL_LDLIBS := -llog
LOCAL_LDFLAGS += -ljnigraphics

include $(BUILD_SHARED_LIBRARY)
APP_OPTIM := debug
LOCAL_CFLAGS := -g

解决方法

好吧,我想我已经在 JNI and Gradle in Android Studio和 Android NDK : Getting java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol “signal” referenced by “libffmpeg.so”的帮助下找到了答案

我的解决方案是做以下事情:

1)使用以下内容添加Application.mk文件:

APP_CFLAGS += -I$(LOCAL_PATH)  
APP_ABI := all  
APP_PLATFORM := android-19

2)更新我的build.gradle指向我的Application.mk,因为显然gradle创建自己的Android.mk版本,默认为与compileSdkVersion中的api级别相同而不是minSdkVersion.

使用com.android.tools.build:gradle:2.2.0,可以通过添加以下内容来实现(有关详细信息,请查看上面提到的JNI SO帖子):

externalNativeBuild {
    ndkBuild {
        path ''src/main/jni/Application.mk''
    }
}

此外,您可能不需要第一步和第二步,但我已经花了太多时间来验证这一点

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

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

更新8/7/2013:
问题现在解决了,但错误的原因是非常意想不到的,所有这些错误的常见嫌疑人在开始时被消除,我已经学到了新的东西.看下面我的回答

我在这里很绝望有一个Android应用程序与本机库,从我称之为方法.我测试的所有系统都没有问题,而且该程序在Google Play中没有任何麻烦的报告,被数以千计的用户使用.现在,显然是一个新的ROM – Android 4.2.2版 – 用于HTC One手机.用户声称这是官方版本,升级形式是官方频道.当他们尝试启动我的应用程序时,它崩溃了,堆栈跟踪说:

java.lang.UnsatisfiedLinkError:未找到本机方法…

并且我知道的方法名称在那里,并且在安装Android 4.1之前在同一台设备上工作正常.我在Android 4.2.2测试它在仿真器(没有这个特定的设备),没有问题.此外,用户尝试使用相同的结果卸载并重新安装该应用程序.即使发送私人构建,没有任何ProGuard / dexguard保护也没有帮助.

还有什么可以导致Android上的java.lang.UnsatisfiedLinkError?或者我应该假设这个HTC ROM是简单的buggy? HTC One与Android 4.2.2有没有其他类似的问题?

编辑7/24/2013

在下面的评论中,另一位开发人员建议系统可能会遇到麻烦找到我的本机库.我通过完全从安装中删除本机库文件,对Genymotion 4.2.2仿真器进行了实验.在这种情况下,错误信息有所不同:

W/System.err: Caused by: java.lang.UnsatisfiedLinkError: Couldn’t load cld from loader dalvik.system.PathClassLoader[dexPath=/data/app/com.hyperionics.avar-2.apk,libra‌​ryPath=/data/app-lib/com.hyperionics.avar-2]: findLibrary returned null

在堆栈跟踪消息我从HTC One用户Android 4.2.2我看到这个错误消息:

Caused by: java.lang.UnsatisfiedLinkError: Native method not found: com.hyperionics.avar.CldWrapper.detectLangNative:(Ljava/lang/String;)[Ljava/lang‌​/String;

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

更新7/25/2013

开始一个赏金50代表.点,因为我没有HTC One,并且卡住了.会接受一个答案,或者指出一个方法来解决问题 – 答复人将测试我的代码mod.以表明它的作品 – 或证明这是HTC One最近的Android 4.2.2 ROM中的一个错误.该应用程序是https://play.google.com/store/apps/details?id=com.hyperionics.avar

更新7/31/2013

最后一天的赏金还没有答案,没有任何建议…到目前为止,所有这样的错误报告我来自欧洲,报告品牌是“htc_europe”或“vodafone_fr”.也许这个错误本地化到欧洲(法国德国)只有…如果有人在那里与HTC One和Android更新到4.2.2,如果错误发生在其他国家或其他提供商,我会感兴趣.

格雷格

解决方法

在赏金期间没有令人满意的答案.我订购的设备,将不得不调试最有可能是Android 4.2.2更新的设备ROM中的系统错误…

Update 6/20/2014偶尔的不满意的链接错误的另一个原因

事实证明,有时候,当从Google Play更新应用程序时,本机库未正确安装.也许安装程序用完了空间,或者其他一些奇怪的系统错误,请参阅this SO question和答案.

更新8/6/2013 – 神秘解决!

我的HTC One订购从Google Play到达,并且…神秘解决!来自Google Play的原始Android 4.2.2也发生了同样的事故.问题是我的库名称:cld,它生成一个名为libcld.so的共享库.显然系统有另一个同名的共享库,其中我期望的方法不存在,当然可能有一些“插件”将其他libcld.so加载到进程内存中,我自己的库被跳过.我更名为本地图书馆,该计划立即开始工作.

我不知道在Android的不同版本上有这样的名字冲突的可能性…有没有读过这个在NDK文档中看到一个警告?我想我将从现在开始,用我的公司名称或其他东西创建的所有本地图书馆.

Android NDK UnsatisfiedLinkError:“dlopen失败:空/丢失DT_HASH”

Android NDK UnsatisfiedLinkError:“dlopen失败:空/丢失DT_HASH”

我正在使用崩溃报告服务跟踪我们的Android应用程序(使用NDK加载C库)的崩溃.少数用户遇到以下崩溃:

java.lang.UnsatisfiedLinkError: dlopen Failed: empty/missing DT_HASH in "cpplibrary.so" (built with --hash-style=gnu?)
   at java.lang.Runtime.loadLibrary(Runtime.java:365)
   at java.lang.System.loadLibrary(System.java:526)

我可以在互联网上找到的这个错误提及(例如这个Google Groups post)讨论了构建lib的问题,这会导致每次运行应用程序时都会出现此错误.几乎没有关于为什么偶尔会发生这种情况的信息. This post是我能找到的最接近的.

根据崩溃痕迹,看起来任何特定的用户都会经历这种不断的延伸;我不确定这些用户是否能够正确加载lib.有没有人对有时可能导致这种情况发生的想法有所了解?我可以以不同的方式进行NDK构建以试图阻止它吗?

谢谢!

编辑:This post提到了有条件地获得此类错误的两种方法;我会照顾他们.

Edit2:构建文件:
Android.mk(摘录):

include $(CLEAR_VARS)
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)
LOCAL_C_INCLUDES := 

Application.mk:

APP_STL := stlport_static
APP_CFLAGS += -std=c++11
最佳答案
如果您是第三方构建.so库供其他人使用,设置-Wl,– hash-style =两者似乎都是最好的主意.这样可以加快Gnu样式哈希的加载速度和SysV哈希的向后兼容性.

Android NDK项目:java.lang.UnsatisfiedLinkError:dalvik.system.PathClassLoader

Android NDK项目:java.lang.UnsatisfiedLinkError:dalvik.system.PathClassLoader

如何解决Android NDK项目:java.lang.UnsatisfiedLinkError:dalvik.system.PathClassLoader?

我是NDK的新手。

我想在我的标准Java Android Studio项目中添加一些C ++代码。

我做了什么:

  1. 在主文件夹下添加cpp文件夹

  2. 在my cpp文件夹中添加myccplib.cpp和myccplib.h

  3. 在Gradle(模块)中添加以下内容:

    android { 
    
     externalNativeBuild {
    
             cmake {
    
                 version "3.10.2"
             } 
     } 
     }
    
  4. myccplib.cpp中的
  5. 代码:

    #include "myccplib.h"
    
    
     #include <jni.h>
     #include <string>
    
     extern "C" JNIEXPORT jstring JNICALL
    
    
     Java_com_example_tof_MainActivity_stringFromJNI( jnienv *env,jobject /* this */) {
         std::string hello = "Hello,World!";
         return env->NewStringUTF(hello.c_str());
     }
    
  6. MainActivity.java中的代码:

 public class MainActivity extends AppCompatActivity {

    static {
        System.loadLibrary("myccplib"); // "myjni.dll" in Windows,"libmyjni.so" in Unixes
    }


    public native String stringFromJNI();


 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

  String s = stringFromJNI();
        Log.d("stringFromJNI " + s);



}

}

我的CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.4.1)

# Creates and names a library,sets it as either STATIC
# or SHARED,and provides the relative paths to its source code.
# You can define multiple libraries,and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.

add_library( # Sets the name of the library.
             native-lib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             native-lib.cpp )

# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default,you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.

find_library( # Sets the name of the path variable.
              log-lib

              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log )

# Specifies libraries CMake should link to your target library. You
# can link multiple libraries,such as libraries you define in this
# build script,prebuilt third-party libraries,or system libraries.

target_link_libraries( # Specifies the target library.
                       native-lib

                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )

问题:我崩溃了:

2020-10-14 19:02:45.465 25918-25918/com.example.tof E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.tof,PID: 25918
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.example.tof-t8Csh416BSdO6UBfZv0mOw==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.tof-t8Csh416BSdO6UBfZv0mOw==/lib/arm64,/system/lib64,/product/lib64]]] Couldn''t find "libmyccplib.so"
    at java.lang.Runtime.loadLibrary0(Runtime.java:1067)
    at java.lang.Runtime.loadLibrary0(Runtime.java:1007)
    at java.lang.System.loadLibrary(System.java:1667)
    at com.example.tof.MainActivity.<clinit>(MainActivity.java:37)

我使用的是Android 4.0。

有人能告诉我我想念什么吗?

谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

Android ReactNative java.lang.UnsatisfiedLinkError:可以找到要加载的DSO:libreactnativejni.so

Android ReactNative java.lang.UnsatisfiedLinkError:可以找到要加载的DSO:libreactnativejni.so

我一直在尝试将ReactNative添加到我现有的android应用程序中.我遵循了this链接中的说明.我可以添加它,但是一旦打开react native活动,应用程序就会崩溃.我已经开始使用服务器

adb reverse tcp:8081 tcp:8081

并开始使用本机

react-native start

我得到一个对话框,提示js文件正在加载.但是最后以崩溃告终.以下是在logcat中打印的错误:

java.lang.UnsatisfiedLinkError: Couldn't find DSO to load: libreactnativejni.so
    at com.facebook.soloader.soLoader.loadLibraryBySoName(SoLoader.java:213)
    at com.facebook.soloader.soLoader.loadLibrary(SoLoader.java:178)
    at com.facebook.react.bridge.JSCJavaScriptExecutor.<clinit>(JSCJavaScriptExecutor.java:19)
    at com.facebook.react.ReactInstanceManager.onjsBundleLoadedFromServer(ReactInstanceManager.java:413)
    at com.facebook.react.ReactInstanceManager.createReactContextInBackground(ReactInstanceManager.java:236)

我完全迷路了,因为我无法找出导致此问题的原因.

提前致谢.

解决方法:

这是由以下问题引起的(开放2年)https://github.com/facebook/react-native/issues/2814

从问题:

React Native on Android doesn’t provide a 64-bit version of the libreactnativejni.so native library, which can cause compatibility issues on 64-bit devices. I ran into this while attempting to integrate React Native with a large existing application I’m developing.

来自Facebook的反应:

Thanks for reporting! Yes we don’t provide 64-bit version of the native code and the system should always fall back to 32-bit.

And:

Most Android projects use a number of 3rd-party libraries, and any that include native 64-bit code will cause React Native to fail.

以下SO回答Use 32-bit jni libraries on 64-bit android解释了回退到32位库以及您无法混合使用的事实.因此,如果找到64位,则所有都应为64位

我建议阅读Github问题#2814.建议了多个修复程序,但是哪种方法有效取决于您的情况.

发行人还写了一个博客:Mixing 32- and 64-bit Dependencies in Android

希望这可以帮助!

关于android – UnsatisfiedLinkError:dlopen失败:无法找到引用的符号“__aeabi_memcpy4”的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Android NDK UnsatisfiedLinkError – 一个令人惊讶的原因、Android NDK UnsatisfiedLinkError:“dlopen失败:空/丢失DT_HASH”、Android NDK项目:java.lang.UnsatisfiedLinkError:dalvik.system.PathClassLoader、Android ReactNative java.lang.UnsatisfiedLinkError:可以找到要加载的DSO:libreactnativejni.so等相关知识的信息别忘了在本站进行查找喔。

本文标签: