dev*_*rgg 50 c++ android swig android-library
有没有经历过这个错误的人?
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/org.swig.simple-2/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "liborg.swig.simple.example.so"
Run Code Online (Sandbox Code Playgroud)
通过这种方式加载库时发生错误.
static {
System.loadLibrary("example");
}
Run Code Online (Sandbox Code Playgroud)
我确定'example'类存在于当前文件夹中.
Mic*_*CMS 47
请注意,有一个命名约定.您的lib需要被称为libexample.so.
LoadLibrary("example")将查找libexample.so.
.so库需要在lib文件夹下的apk下面(因为你正在为Android开发,它需要在lib/armeabi和lib/armeabi-v7a文件夹下 - 为什么这两个文件夹?某些版本的Android看起来在lib下/ armeabi和一些看下lib/armeabi-v7a ... se什么对你有用).
其他要寻找的东西:
确保编译正确的体系结构(如果编译为armeabi v5,它将无法在armeabiv7或armeabiv7s上运行).
确保导出的原型在正确的类中使用(请参阅hello jni示例.您的公开函数需要看起来像Java_mypackagename_myjavabridgeclass_myfunction).
例如,函数Java_com_example_sample_hello将在java类com.example.sample,function hello中进行转换.
Ale*_*lex 30
这对我有帮助.为可能提出相同问题的人分享.
android {
....
defaultConfig {
....
ndk {
abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
}
}
}
Run Code Online (Sandbox Code Playgroud)
Kin*_*ses 25
我目前正在开发一个流式广播的Android应用程序.我使用原生解码器库,称为aacdecoder.一切都很好,直到应用程序在某些Android设备上出现崩溃错误.这真的很烦人.因为应用程序完美播放几乎所有设备的无线电流,但三星S6和S6 Edge.
崩溃报告说
Fatal Exception: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file “/data/app/com.radyoland.android-1/base.apk”],nativeLibraryDirectories=[/data/app/com.radyoland.android-1/lib/arm64, /vendor/lib64, /system/lib64]]] couldn’t find “libaacdecoder.so”
at java.lang.Runtime.loadLibrary(Runtime.java:366)
at java.lang.System.loadLibrary(System.java:988)
at com.spoledge.aacdecoder.Decoder.loadLibrary(Decoder.java:187)
Run Code Online (Sandbox Code Playgroud)
如您所见,崩溃说它无法加载本机库.但为什么?首先,我检查了我的结构,如果本机库.so文件正确定位.
看起来一切都还好,除了这个疯狂的错误.然后经过一些研究,我发现一些Android设备有64位处理器.此设备生成并检查arm64文件夹以加载本机库.那就是问题所在.因为我的项目没有arm64文件夹.这是解决方案;
defaultConfig {
...
ndk {
abiFilters "armeabi-v7a", "x86", "armeabi", "mips"
}
}
Run Code Online (Sandbox Code Playgroud)
您需要将此过滤器(abiFilters)添加到app模块的build.gradle文件中.因此,当您的设备尝试运行您的应用时,它将检查gradle文件,并了解它不应生成任何文件夹并使用现有的本机库资源.轰,几乎解决了.但还有一件事.
android.useDeprecatedNdk=true
Run Code Online (Sandbox Code Playgroud)
将此行添加到gradle.properties以使用已弃用的Ndk.
最后我的应用程序适用于S6和S6 Edge.我的意思是它适用于每个拥有新64位处理器的设备.
小智 11
对我有用的是将jniLibs文件夹放在 "main"文件夹下,除了"java"和"res"文件夹之外,例如项目 - > app - > src - > main - > jniLibs
我拥有所有具有正确名称的库,每个库都放在各自的架构子文件夹中,但我仍然有相同的异常; 甚至尝试了很多其他的SO答案,比如这里接受的答案,用.so libs编译JAR,jniLibs文件夹的其他放置等等.
对于这个项目,我不得不在Android Studio 1.5.1上使用Gradle 2.2和Android插件1.1.0
-if gradle.properties不可用,然后首先添加该文件并添加
android.useDeprecatedNdk=true
- 在build.gradle中使用此代码
defaultConfig {
applicationId 'com.example.application'
minSdkVersion 16
targetSdkVersion 21
versionCode 11
versionName "1.1"
ndk {
abiFilters "armeabi"
}
}
Run Code Online (Sandbox Code Playgroud)
`
这对我有用
如果您在armeabi中有.so文件,那么单独在ndk内部提到该文件夹.
defaultConfig {
applicationId "com.xxx.yyy"
minSdkVersion 17
targetSdkVersion 26
versionCode 1
versionName "1.0"
renderscriptTargetApi 26
renderscriptSupportModeEnabled true
ndk {
abiFilters "armeabi"
}
}
Run Code Online (Sandbox Code Playgroud)
然后使用它
android.useDeprecatedNdk=true;
Run Code Online (Sandbox Code Playgroud)
在gradle.properties文件中
帮助我的是在 build.gradle 文件中注册 jni 文件的源目录。将此添加到您的 gradle 文件中:
android {
sourceSets {
main {
jniLibs.srcDir '[YOUR_JNI_DIR]' // i.e. 'libs'
}
}
}
Run Code Online (Sandbox Code Playgroud)
一些旧的gradle工具无法通过某种方式将.so文件复制到build文件夹中,手动将这些文件复制到build文件夹中,如下所示可以解决问题:
build/intermediates/rs/{build config}/{support architecture}/
Run Code Online (Sandbox Code Playgroud)
build config:beta/production/sit/uat
支持架构:armeabi/armeabi-v7a/mips/x86
如果您使用的是 Android studio,只需编辑根文件夹中的 gradle.properties 并添加 android.useDeprecatedNdk=true 即可。然后编辑应用程序文件夹中的 build.gradle 文件,设置 abiFilters 如下:
android {
....
defaultConfig {
....
ndk {
abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
81646 次 |
| 最近记录: |