此问题是此other question of mine之后的后续主题。
在最终成功使用gradle和cmake成功构建了apk文件并将FFMPEG集成到Android项目之后,我遇到了一个新异常,该异常在调用System.loadLibrary
时抛出。
java.lang.UnsatisfiedLinkError: dlopen failed: library "libavutil.so.56" not found
at java.lang.Runtime.loadLibrary0(Runtime.java:1016)
at java.lang.System.loadLibrary(System.java:1657)
at com.hmomeni.canto.activities.EditActivity.<init>(EditActivity.kt:26)
at java.lang.Class.newInstance(Native Method)
at android.app.Instrumentation.newActivity(Instrumentation.java:1174)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2669)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
这是导致错误的代码部分:
class EditActivity : AppCompatActivity(), View.OnClickListener {
init {
System.loadLibrary("Canto")
}
...
}
我尝试将.so
中的PROJECT/app/jniLibs
文件移到build.gradle
文件中,但无济于事。
sourceSets.main.jniLibs.srcDirs = ['./jniLibs/']
答案 0 :(得分:2)
如果您按以下方式配置 jniLibs.srcDirs :
sourceSets.main.jniLibs.srcDirs = ['./jniLibs/']
然后,您的路径app/jniLibs/ffmpeg/{ANDROID_ABI}/lib
不正确,并且构建系统将找不到.so
文件并将其打包。
尝试使您的 jniLibs 结构如下:
jniLibs
│ ├── x86
│ ├── x86_64
│ ├── arm64-v8a
│ ├── armeabi-v7a
不要在lib
后面添加{ANDROID_ABI}/
。
---编辑---
在使用System.loadLibrary手动加载库之后,我遇到了一个新错误,该错误表明libavutil具有文本重定位,并且对于API-23及更高版本,似乎不允许这样做。
也许您应该尝试使用选项--disable-asm
和-fPIC
构建ffmpeg,以使二进制文件没有文本重定位。参见此处https://stackoverflow.com/a/39965908/8034839,但NEON仍然存在一些问题。
另一个讨论供您参考: https://stackoverflow.com/a/50207091/8034839