2015-10-02 15 views
5

問題の解決策を探したり、さまざまなフォーラム(これを含む)を閲覧したりして時間を過ごした後、最終的に私は別の場所で完全に回答されていないことを願って質問しました。私はかなり複雑なアーキテクチャ構築しようとしているAndroidスタジオ - App + NDKモジュールライブラリ

  • 私は私がコンパイルCソースを持っているが、私は、モジュールライブラリでJNI経由でそれらを使用する(.A)
  • 静的ライブラリを分離
  • 私はこのライブラリをアプリプロジェクトで使いたいです。

私は最初に正常に次のテストを行いました - 私はすでにNDKのないモジュールライブラリを作成し、アプリケーションでコンパイルすることができました。 - は私もアプリ内で直接静的ライブラリとJNIを使​​用するように管理しますが

私は、次のステップで失敗しています: - モジュールのクラスを呼び出すモジュールとアプリ内のJNIの組み合わせは動作しません。 。

aarがライブラリのbuild/outputsディレクトリにある間に私のアプリケーションのビルドディレクトリでexploded-aarを見つけることができないので、aarのインクルードに問題があると思います。さらに、以前のすべてのテスト( JNIの使用を含む)はすべて成功しました。

私は実験的なモデルで、実験的なもので、静的ライブラリには既知の制限があるため、使用しません。

私のプロジェクトの構造は次のとおりです。

- App 
    - src 
     - main 
      - java 
       - activity 
- bar 
    - src 
     - main 
      - java 
       - class 
      - jni 
       - include 
        - *.h 
       - libs 
        - abis... 
         - libmod1.a 
         - libmod2.a 
       Android.mk 
       Application.mk 
       bar.c 
       bar.h 

アプリのbuild.gradleは次のようになります。

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.0" 

    defaultConfig { 
     applicationId "com.test.foo" 
     minSdkVersion 10 
     targetSdkVersion 23 
     versionCode 1 
     versionName "1.0" 
    } 

    buildTypes { 

     release { 
      debuggable   false 
      jniDebuggable  false 
      minifyEnabled  false 
     } 
     unsigned { 
      debuggable   false 
      jniDebuggable  false 
      minifyEnabled  false 
     } 
     debug { 
      debuggable   true 
      jniDebuggable  true 
      minifyEnabled  false 
     } 
    } 


    productFlavors { 
     x86 { 
      ndk { 
       abiFilter "x86" 
      } 
     } 
     mips { 
      ndk { 
       abiFilter "mips" 
      } 
     } 
     armv7 { 
      ndk { 
       abiFilter "armeabi-v7a" 
      } 
     } 
     arm { 
      ndk { 
       abiFilter "armeabi" 
      } 
     } 
     fat 
    } 

    project.ext.versionCodes = ['armeabi':1, 'armeabi-v7a':2, 'arm64-v8a':3, 'mips':5, 'mips64':6, 'x86':8, 'x86_64':9] 

    android.applicationVariants.all { variant -> 
     variant.outputs.each { output -> 
      output.versionCodeOverride = 
        project.ext.versionCodes.get(output.getFilter(com.android.build.OutputFile.ABI), 0) * 1000000 + defaultConfig.versionCode 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar','*.aar']) 
    compile project(":bar") 
} 

モジュールbuild.gradleは次のようになります。

apply plugin: 'com.android.library' 

android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.0" 

    defaultConfig { 
     minSdkVersion 10 
     targetSdkVersion 23 
     versionCode 1 
     versionName "1.0" 

     ndk { 
      moduleName "module" 
     } 
    } 
    buildTypes { 

     release { 
      debuggable  false 
      jniDebuggable false 
      minifyEnabled false 
     } 
     unsigned { 
      debuggable  false 
      jniDebuggable false 
      minifyEnabled false 
     } 
     debug { 
      debuggable  true 
      jniDebuggable true 
      minifyEnabled false 
     } 
    } 

    productFlavors { 
     x86 { 
      ndk { 
       abiFilter "x86" 
      } 
     } 
     mips { 
      ndk { 
       abiFilter "mips" 
      } 
     } 
     armv7 { 
      ndk { 
       abiFilter "armeabi-v7a" 
      } 
     } 
     arm { 
      ndk { 
       abiFilter "armeabi" 
      } 
     } 
     fat 
    } 
    sourceSets.main { 
     jniLibs.srcDir 'src/main/libs' 
     jni.srcDirs  = [] 
    } 

    task ndkBuild(type: Exec) { 
     commandLine android.ndkDirectory.getAbsolutePath()+'/ndk-build', '-C', file('src/main').absolutePath 
    } 

    tasks.withType(JavaCompile) { 
     compileTask -> compileTask.dependsOn ndkBuild 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
} 

私のAndroid.mkは、モジュールjniディレクトリ内にあります: LOCAL_PATH:= $(my-dirを呼び出します)

#### Mod1 
include $(CLEAR_VARS) 
LOCAL_MODULE   := mod1 
LOCAL_SRC_FILES   := libs/$(TARGET_ARCH_ABI)/libmod1.a 
include $(PREBUILT_STATIC_LIBRARY) 

#### Mod2 
include $(CLEAR_VARS) 
LOCAL_MODULE   := pxnav 
LOCAL_SRC_FILES   := libs/$(TARGET_ARCH_ABI)/libmod2.a 
LOCAL_STATIC_LIBRARIES := pxfd 
include $(PREBUILT_STATIC_LIBRARY) 

##### Parser 
include $(CLEAR_VARS) 
LOCAL_MODULE   := module 
LOCAL_C_INCLUDES  := $(LOCAL_PATH)/include 
LOCAL_LDLIBS   += -landroid -llog 
LOCAL_SRC_FILES   := bar.c 
LOCAL_STATIC_LIBRARIES := mod1 mod2 
include $(BUILD_SHARED_LIBRARY) 
+0

私は、生成されたaarを直接使用すると、それを追加します。新しいモジュール> .jar/.aarをインポートすると、それも完全に動作します。私はコンパイルするたびに指定されたディレクトリにaarをコピーする必要はありません。 –

答えて

0

私は、同様のタスクのための簡単な回避策が見つかりました:私は単にアプリモジュールのjniLibs.srcDirを設定します。今私はaarを爆発させて.soファイルを入手することに依存しません。ところで、実験用のプラグイン(ネイティブデバッグ、C++構文の強調表示、クロスリファレンス、およびその他の細部を使用する)に切り替えると、define LOCAL_SRC_FILES in ndk{} DSLをチェックすることになります。

+0

私はそれがどのように役立つのか分かりません。あなたは、アプリケーション内のjniLibs.srcDirをモジュール内のlibsディレクトリに設定しますか?その場合、どのようにアプリケーションがaarのクラスを参照するように管理しますか?私の問題は、バーモジュールライブラリのクラスでもアプリケーションで使用できないということです。 –

+0

あなたのソリューションを試しましたが、実際に私のAPKにリンクされているライブラリを持っていますが、AARのクラスはまだAPKから抜けていて、アプリケーションでインスタンス化できません。 –

+0

ライブラリはネイティブコードを作成しません。それは純粋なJavaモジュールであるふりをする。あなたはあなたの予備実験の1つで図書館を使うことに成功したと言いましたか? –

関連する問題