Android Studio 1.3 RC1 NDK 无法加载原生库
Android Studio 1.3 RC1 NDK Unable to load native library
今晚我切换了我的 ndk 应用程序以使用新的 Android Studio 1.3 预览版。我有 2 台设备 Nexus 5(5.1.1) 和 MotoG(4.4.4)。通过 ndk-build 编译时,该应用程序可在两种设备上运行。使用 gradle 构建 Nexus 5 可以正确执行,但在 MotoG 上出现异常:
07-11 04:13:58.509 16751-16751/com.mbyan.android E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.mbyan.android, PID: 16751
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mbyan.android/com.mbyan.android.GL2JNIActivity}: java.lang.IllegalArgumentException: Unable to load native library: /data/app-lib/com.mbyan.android-1/libgl2jni.so
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2198)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2257)
at android.app.ActivityThread.access0(ActivityThread.java:139)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5086)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalArgumentException: Unable to load native library: /data/app-lib/com.mbyan.android-1/libgl2jni.so
at android.app.NativeActivity.onCreate(NativeActivity.java:183)
at com.mbyan.android.GL2JNIActivity.onCreate(GL2JNIActivity.java:40)
at android.app.Activity.performCreate(Activity.java:5248)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:111)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2162)
build.gradle 看起来像:
apply plugin: 'com.android.model.application'
model {
android {
compileSdkVersion = 21
buildToolsVersion = "22.0.1"
defaultConfig.with {
applicationId = "com.mbyan.android"
minSdkVersion.apiLevel = 14
targetSdkVersion.apiLevel = 14
versionCode = 1
versionName = "1.0"
}
compileOptions.with {
sourceCompatibility JavaVersion.VERSION_1_6
targetCompatibility JavaVersion.VERSION_1_6
}
}
android.ndk {
moduleName = "gl2jni"
stl = "stlport_static"
ldLibs += "log"
ldLibs += "android"
ldLibs += "EGL"
ldLibs += "GLESv2"
String includeBasePath = "-I${projectDir}/src/main/jni/engine/include"
String includeBaseGlm = "-I${projectDir}/src/main/jni/engine/glm"
String includeBaseLua = "-I${projectDir}/src/main/jni/engine/lua"
String includeAppGlue = "-I${projectDir}/src/main/jni/android_app_glue"
CFlags += includeBaseGlm
CFlags += includeBasePath
CFlags += includeBaseLua
CFlags += includeAppGlue
CFlags += "-DGL_V_2"
CFlags += "-DUSE_ANDROID"
cppFlags += includeBaseGlm
cppFlags += includeBasePath
cppFlags += includeBaseLua
cppFlags += includeAppGlue
cppFlags += "-DGL_V_2"
cppFlags += "-DUSE_ANDROID"
}
// You can modify the NDK configuration for each variant.
components.android {
binaries.afterEach { binary ->
binary.mergedNdkConfig.cppFlags.add(
"-DVARIANT=\"" + binary.name + "\"")
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.0'
}
Studio 1.3 build.gradle 看起来与 <1.3 不同,更改概述于:
http://tools.android.com/tech-docs/new-build-system/gradle-experimental
正在工作Android.mk:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := gl2jni
LOCAL_CFLAGS := -DGL_V_2 -DUSE_ANDROID -I$(LOCAL_PATH)/engine/include -I $(LOCAL_PATH)/engine/glm -I $(LOCAL_PATH)/engine/lua
FILE_LIST := $(wildcard $(LOCAL_PATH)/**/*.cpp)
FILE_LIST += $(wildcard $(LOCAL_PATH)/*.cpp)
FILE_LIST += $(wildcard $(LOCAL_PATH)/engine/lua/*.c)
FILE_LIST += $(wildcard $(LOCAL_PATH)/*.c)
LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)
LOCAL_STATIC_LIBRARIES := android_native_app_glue
LOCAL_LDLIBS := -llog -lGLESv2 -landroid -lEGL
include $(BUILD_SHARED_LIBRARY)
$(call import-module, native_app_glue)
和Application.mk:
APP_ABI := all
APP_STL := gnustl_static
APP_PLATFORM := android-14
您还会注意到 LOCAL_STATIC_LIBRARIES 中概述的依赖关系:android_native_app_glue
。我已经将android_native_app_glue.c/android_native_app_glue.h复制到项目中,因为我还没有找到link依赖库的方法。
顺便说一句,我正在使用 NativeActivity,它会自动从 AndroidManifest Activity 元数据加载本机共享库。
AndroidManifest.xml:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mbyan.android" >
<application
android:label="@string/gl2jni_activity" android:hasCode="true" android:icon="@drawable/ic_launcher">
<activity android:name=".GL2JNIActivity"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:launchMode="singleTask"
android:screenOrientation="landscape"
android:configChanges="orientation|keyboardHidden">
<meta-data android:name="android.app.lib_name"
android:value="gl2jni" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-feature android:glEsVersion="0x00020000" android:required="true"/>
<uses-sdk android:minSdkVersion="14"/>
</manifest>
有没有人遇到过类似的问题?
我认为您的问题是因为 ndk 集成当前选择的 APP_PLATFORM 不正确。
我之前在这里报告过这个错误:https://code.google.com/p/android/issues/detail?id=177530
引自官方 release doc,截至 7 月 14 日:
There’s no support for NDK-only modules. The only supported project
types are hybrid app projects and hybrid Library Projects.
所以,也许我们应该等待 NativeActivity 得到完全支持。
今晚我切换了我的 ndk 应用程序以使用新的 Android Studio 1.3 预览版。我有 2 台设备 Nexus 5(5.1.1) 和 MotoG(4.4.4)。通过 ndk-build 编译时,该应用程序可在两种设备上运行。使用 gradle 构建 Nexus 5 可以正确执行,但在 MotoG 上出现异常:
07-11 04:13:58.509 16751-16751/com.mbyan.android E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.mbyan.android, PID: 16751
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mbyan.android/com.mbyan.android.GL2JNIActivity}: java.lang.IllegalArgumentException: Unable to load native library: /data/app-lib/com.mbyan.android-1/libgl2jni.so
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2198)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2257)
at android.app.ActivityThread.access0(ActivityThread.java:139)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5086)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalArgumentException: Unable to load native library: /data/app-lib/com.mbyan.android-1/libgl2jni.so
at android.app.NativeActivity.onCreate(NativeActivity.java:183)
at com.mbyan.android.GL2JNIActivity.onCreate(GL2JNIActivity.java:40)
at android.app.Activity.performCreate(Activity.java:5248)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:111)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2162)
build.gradle 看起来像:
apply plugin: 'com.android.model.application'
model {
android {
compileSdkVersion = 21
buildToolsVersion = "22.0.1"
defaultConfig.with {
applicationId = "com.mbyan.android"
minSdkVersion.apiLevel = 14
targetSdkVersion.apiLevel = 14
versionCode = 1
versionName = "1.0"
}
compileOptions.with {
sourceCompatibility JavaVersion.VERSION_1_6
targetCompatibility JavaVersion.VERSION_1_6
}
}
android.ndk {
moduleName = "gl2jni"
stl = "stlport_static"
ldLibs += "log"
ldLibs += "android"
ldLibs += "EGL"
ldLibs += "GLESv2"
String includeBasePath = "-I${projectDir}/src/main/jni/engine/include"
String includeBaseGlm = "-I${projectDir}/src/main/jni/engine/glm"
String includeBaseLua = "-I${projectDir}/src/main/jni/engine/lua"
String includeAppGlue = "-I${projectDir}/src/main/jni/android_app_glue"
CFlags += includeBaseGlm
CFlags += includeBasePath
CFlags += includeBaseLua
CFlags += includeAppGlue
CFlags += "-DGL_V_2"
CFlags += "-DUSE_ANDROID"
cppFlags += includeBaseGlm
cppFlags += includeBasePath
cppFlags += includeBaseLua
cppFlags += includeAppGlue
cppFlags += "-DGL_V_2"
cppFlags += "-DUSE_ANDROID"
}
// You can modify the NDK configuration for each variant.
components.android {
binaries.afterEach { binary ->
binary.mergedNdkConfig.cppFlags.add(
"-DVARIANT=\"" + binary.name + "\"")
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.0'
}
Studio 1.3 build.gradle 看起来与 <1.3 不同,更改概述于:
http://tools.android.com/tech-docs/new-build-system/gradle-experimental
正在工作Android.mk:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := gl2jni
LOCAL_CFLAGS := -DGL_V_2 -DUSE_ANDROID -I$(LOCAL_PATH)/engine/include -I $(LOCAL_PATH)/engine/glm -I $(LOCAL_PATH)/engine/lua
FILE_LIST := $(wildcard $(LOCAL_PATH)/**/*.cpp)
FILE_LIST += $(wildcard $(LOCAL_PATH)/*.cpp)
FILE_LIST += $(wildcard $(LOCAL_PATH)/engine/lua/*.c)
FILE_LIST += $(wildcard $(LOCAL_PATH)/*.c)
LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)
LOCAL_STATIC_LIBRARIES := android_native_app_glue
LOCAL_LDLIBS := -llog -lGLESv2 -landroid -lEGL
include $(BUILD_SHARED_LIBRARY)
$(call import-module, native_app_glue)
和Application.mk:
APP_ABI := all
APP_STL := gnustl_static
APP_PLATFORM := android-14
您还会注意到 LOCAL_STATIC_LIBRARIES 中概述的依赖关系:android_native_app_glue
。我已经将android_native_app_glue.c/android_native_app_glue.h复制到项目中,因为我还没有找到link依赖库的方法。
顺便说一句,我正在使用 NativeActivity,它会自动从 AndroidManifest Activity 元数据加载本机共享库。
AndroidManifest.xml:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mbyan.android" >
<application
android:label="@string/gl2jni_activity" android:hasCode="true" android:icon="@drawable/ic_launcher">
<activity android:name=".GL2JNIActivity"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:launchMode="singleTask"
android:screenOrientation="landscape"
android:configChanges="orientation|keyboardHidden">
<meta-data android:name="android.app.lib_name"
android:value="gl2jni" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-feature android:glEsVersion="0x00020000" android:required="true"/>
<uses-sdk android:minSdkVersion="14"/>
</manifest>
有没有人遇到过类似的问题?
我认为您的问题是因为 ndk 集成当前选择的 APP_PLATFORM 不正确。
我之前在这里报告过这个错误:https://code.google.com/p/android/issues/detail?id=177530
引自官方 release doc,截至 7 月 14 日:
There’s no support for NDK-only modules. The only supported project types are hybrid app projects and hybrid Library Projects.
所以,也许我们应该等待 NativeActivity 得到完全支持。