2015-07-11 35 views
1

今晚我切換了我的NDK應用程序以使用新的Android Studio 1.3預覽。我有2個設備Nexus 5(5.1.1)和MotoG(4.4.4)。當通過ndk-build編譯應用程序在兩個設備上工作。使用gradle這個打造的Nexus 5正確執行,但是,MotoG我得到一個異常:Android Studio 1.3 RC1 NDK無法加載本機庫

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.access$800(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' 
} 

工作室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複製到項目中,因爲我沒有找到鏈接相關庫的方法。

順便說一句我正在使用NativeActivity,它會從AndroidManifest活動元數據中自動加載本地共享庫。

的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> 

有沒有人也有類似的問題?

回答

2

我認爲你的問題來自於當前由ndk集成選擇的APP_PLATFORM不正確的事實。

我早些時候報道這裏這個錯誤:https://code.google.com/p/android/issues/detail?id=177530

+0

嗨,謝謝你的幫忙!我花了一些時間挖掘NdkHandler代碼,並發現通過將compileSdkVersion降低到18來解決問題的臨時開發修復。這並不意味着生產修復,但對於開發/測試非常有效。再次感謝! – canuc

+0

@ ph0b我無法感謝你足夠的...刪除Application.mk中的一行將糟糕的一天變成了稍微糟糕的一天...... – Ysch

0

從官方release doc引用,如7月14日:

有NDK爲僅模塊的支持。唯一受支持的項目 類型是混合應用項目和混合圖書館項目。

所以,可能我們應該等待NativeActivity的完全支持。