問題
openFrameworksをAndroidで動かそうと思い、公式ページの方法に従ってセットアップしていたのですが、サンプルプログラムを動かそうとするとUnsatisfiedLinkErrorでクラッシュしてしまいます。
08-03 16:10:49.877 4680-4680/cc.openframeworks.androidGuiExample E/AndroidRuntime: FATAL EXCEPTION: main
Process: cc.openframeworks.androidGuiExample, PID: 4680
java.lang.UnsatisfiedLinkError: com.android.tools.fd.runtime.IncrementalClassLoader$DelegateClassLoader[DexPathList[[dex file "/data/data/cc.openframeworks.androidGuiExample/files/instant-run/dex/slice-slice_9-classes.dex", dex file "/data/data/cc.openframeworks.androidGuiExample/files/instant-run/dex/slice-slice_8-classes.dex", dex file "/data/data/cc.openframeworks.androidGuiExample/files/instant-run/dex/slice-slice_7-classes.dex", dex file "/data/data/cc.openframeworks.androidGuiExample/files/instant-run/dex/slice-slice_6-classes.dex", dex file "/data/data/cc.openframeworks.androidGuiExample/files/instant-run/dex/slice-slice_5-classes.dex", dex file "/data/data/cc.openframeworks.androidGuiExample/files/instant-run/dex/slice-slice_4-classes.dex", dex file "/data/data/cc.openframeworks.androidGuiExample/files/instant-run/dex/slice-slice_3-classes.dex", dex file "/data/data/cc.openframeworks.androidGuiExample/files/instant-run/dex/slice-slice_2-classes.dex", dex file "/data/data/cc.openframeworks.androidGuiExample/files/instant-run/dex/slice-slice_1-classes.dex", dex file "/data/data/cc.openframeworks.androidGuiExample/files/instant-run/dex/slice-slice_0-classes.dex"],nativeLibraryDirectories=[/data/app/cc.openframeworks.androidGuiExample-2/lib/arm64, /vendor/lib64, /system/lib64]]] couldn't find "libOFAndroidApp.so"
at java.lang.Runtime.loadLibrary(Runtime.java:367)
at java.lang.System.loadLibrary(System.java:1076)
at cc.openframeworks.OFAndroid.<clinit>(OFAndroid.java:1044)
at cc.openframeworks.androidGuiExample.OFActivity.onCreate(OFActivity.java:18)
at android.app.Activity.performCreate(Activity.java:6271)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2417)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2524)
at android.app.ActivityThread.access$900(ActivityThread.java:154)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1391)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:224)
at android.app.ActivityThread.main(ActivityThread.java:5526)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
環境
- Mac OS X 10.10.5 (Yosemite)
- openFrameworks 0.9.3
- Android Studio 2.1.2
- Xperia Z5 (Android 6.0)
原因
openFrameworksのライブラリは32bit版なのですが、どうやら64bitのARMを積んだ端末で動かすと64bitのライブラリを探しに行って見つからなくて落ちる模様。
解決策 (1)
アプリのbuild.gradleにabiFiltersの項目を追加し、64bitのライブラリを読みに行かないようにします。
android {
compileSdkVersion 22
buildToolsVersion "21.1.1"
defaultConfig {
minSdkVersion 8
targetSdkVersion 22
// ここから追加
ndk {
abiFilters "armeabi-v7a"
}
// ここまで
}
(後略)
}
注意
上記を追加すると、プラグインのバージョンによってはエラーが出る場合があります。
その場合はgradle.propertiesに下記を追加します。
android.useDeprecatedNdk=true
解決策 (2)
アプリのbuild.gradleにsplitの項目を追加し、ターゲットとするABIを32bitに限定します。
android {
compileSdkVersion 22
buildToolsVersion "21.1.1"
defaultConfig {
minSdkVersion 8
targetSdkVersion 22
}
// ここから追加
splits {
abi {
enable true
reset()
include 'armeabi-v7a'
}
}
// ここまで
(後略)
}