ndk-buildでドハマリ
📅 2013/05/27
すごくしょうもないことで時間を消費してしまった。 こんなエラー。
05-27 23:11:16.316 17783-17783/com.epy0n0ff.gles4image.sample E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.ExceptionInInitializerError
at java.lang.Class.newInstanceImpl(Native Method)
at java.lang.Class.newInstance(Class.java:1319)
at android.app.Instrumentation.newActivity(Instrumentation.java:1026)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1882)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992)
at android.app.ActivityThread.access$600(ActivityThread.java:127)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4511)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:976)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:743)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.UnsatisfiedLinkError: Couldn't load libgles4image: findLibrary returned null
at java.lang.Runtime.loadLibrary(Runtime.java:365)
at java.lang.System.loadLibrary(System.java:535)
at com.epy0n0ff.gles4image.sample.MainActivity.<clinit>(MainActivity.java:17)
libgles4imageがね~ぞというエラーだけどndk-buildは成功してlibsにアーキテクチャ別のlibgles4imageが入っているので 間違いないはず…。生成物のapkを念の為にzipinfoで調べてみた。
$ zipinfo OpenGLES4ImageSample.apk
-rw---- 2.0 fat 552 bl defN 27-May-13 23:11 res/layout/main.xml
-rw---- 2.0 fat 1648 bl defN 27-May-13 23:11 AndroidManifest.xml
-rw---- 1.0 fat 1292 b- stor 27-May-13 01:31 resources.arsc
-rw---- 1.0 fat 9193 b- stor 26-May-13 16:52 res/drawable-hdpi/ic_launcher.png
-rw---- 1.0 fat 2658 b- stor 26-May-13 16:52 res/drawable-ldpi/ic_launcher.png
-rw---- 1.0 fat 5057 b- stor 26-May-13 16:52 res/drawable-mdpi/ic_launcher.png
-rw---- 1.0 fat 14068 b- stor 26-May-13 16:52 res/drawable-xhdpi/ic_launcher.png
-rw---- 2.0 fat 319884 bl defN 27-May-13 23:11 classes.dex
-rw---- 2.0 fat 13432 bl defN 27-May-13 22:46 lib/armeabi/libgles4image.so
-rw---- 2.0 fat 13436 bl defN 27-May-13 22:46 lib/armeabi-v7a/libgles4image.so
-rw---- 2.0 fat 5312 bl defN 27-May-13 22:46 lib/mips/libgles4image.so
-rw---- 2.0 fat 5208 bl defN 27-May-13 22:46 lib/x86/libgles4image.so
-rw---- 2.0 fat 1070 bl defN 27-May-13 23:11 META-INF/MANIFEST.MF
-rw---- 2.0 fat 1123 bl defN 27-May-13 23:11 META-INF/CERT.SF
-rw---- 2.0 fat 776 bl defN 27-May-13 23:11 META-INF/CERT.RSA
16 files, 395225 bytes uncompressed, 181134 bytes compressed: 54.2%
確かにlibgles4image.soが存在している。俺に間違いはない。 はずだった…。 Android.mkファイルを見てみよう。
$ cat Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := gles4image
...
そう、loadLibraryの引数はLOCAL_MODULEで与えたstringを指定してやらないとだめなんだ…。
static {
System.loadLibrary("libgles4image");
}
な記述を
static {
System.loadLibrary("gles4image");
}
に修正してやるとExceptionは発生しなくなった。 こういうつまらないミスを減らすためにもbuild scriptでサクッとチェックいれる体制を 作っていかねばならんなーと痛感した一日であった。