1

Android Studio NDK プロジェクトであるプロジェクトにネイティブ デバッグを追加しようとしています。以前は、gradle を使用してシェル スクリプトを開始し、NDK ライブラリをビルドしました。現在、gradle-experimental プラグインを使用するように移行しようとしています。

NDK で gradle-experimental を使用することについて、わずかな情報 (ほとんどの場合、ここではAndroid Tools Site - Gradle Experimental ) をネットで探し、プレビュー NDK を使用しているこの build.gradle ファイルをまとめました。 Java ビルドとインラインで NDK ビルドを実行するためのサポート。

断片的な情報から最終的にこれをまとめた後、NDK 部分のビルドを取得することができましたが、依存関係に明確に含まれている httpmime-4.4-beta1.jar ファイルを含めることができませんでした。次のように、さまざまな順列を試しました。

compile files("libs/httpmime-4.4.jar")

ただし、Jar ファイルから欠落しているシンボルのエラーは引き続き表示されます。

build.gradle ソース

    apply plugin: 'com.android.model.application'

    String APP_PACKAGE_NAME = 'com.obfuscated.app',
           VERSION_NAME = '3.0',
           TOOLS_VERSION = '23.0.2'

    int VERSION_CODE = 15,
        MIN_SDK_VERSION = 13,
        TARGET_SDK_VERSION = 19,
        COMPILE_SDK_VERSION = 23

    model {
        repositories {
            libs(PrebuiltLibraries) {
                // prebuilt binaries mirroring Android.mk
                libstuff {
                    headers.srcDirs.add(file("jni/stuff/include/stuff"))
                    binaries.withType(SharedLibraryBinary) {
                        sharedLibraryFile = file("jni/stuff/lib/libstuff.so")
                    }
                }
                // ...several more of these actually exist in build.gradle and are working
                cares {
                    headers.srcDirs.add(file("jni/c-ares/include"))
                    binaries.withType(SharedLibraryBinary) { 
                        // StaticLibraryBinary and staticLibraryFile doesnt work despite sample code, at least not for com.android.tools.build:gradle-experimental:0.6.0-alpha5, this builds even though its a static-lib
                        sharedLibraryFile = file("jni/c-ares/lib/libcaresARM.a")
                    }
                }
            }
        }
        android {
            compileSdkVersion = COMPILE_SDK_VERSION
            buildToolsVersion = TOOLS_VERSION

            defaultConfig.with {
                applicationId = APP_PACKAGE_NAME
                minSdkVersion.apiLevel = MIN_SDK_VERSION
                targetSdkVersion.apiLevel = TARGET_SDK_VERSION
                versionCode = VERSION_CODE
                versionName = VERSION_NAME

                buildConfigFields {
                    create() {
                        type "int"
                        name "VALUE"
                        value "1"
                    }
                }

                compileOptions.with {
                    sourceCompatibility = JavaVersion.VERSION_1_7
                    targetCompatibility = JavaVersion.VERSION_1_7
                }
            }

            signingConfigs {
                create("appRelease") {
                    storeFile file('sign.jks')
                    storePassword '...'
                    keyAlias '...'
                    keyPassword '...'
                    storeType "jks"
                }
            }
        } // end android

        android.lintOptions {
            abortOnError = false
        }

        android.packagingOptions {
            exclude 'META-INF/NOTICE'
            exclude 'META-INF/LICENSE'
            exclude 'META-INF/services/javax.annotation.processing.Processor'
        }

        android.ndk {
            moduleName = "native"
            toolchain "clang"
            toolchainVersion "3.5"
            platformVersion = MIN_SDK_VERSION

            ldLibs.addAll('atomic', 'android', 'log', 'OpenSLES')
            abiFilters.addAll(["armeabi", "armeabi-v7a"])
            CFlags.addAll(["-mfloat-abi=softfp", "-mfpu=neon", "-O3", "-DCARES_STATICLIB", "-Wno-c++11-long-long"])
            cppFlags.addAll(["-I${file("jni")}".toString(),
                             "-I${file("jni/c-ares/include")}".toString(),
                             "-I${file("jni/coffeecatch")}".toString()])
            stl = "stlport_shared"
        }

        android.sources {
            main {
                jniLibs {
                    dependencies {

                    }
                }
                jni {
                    dependencies {
                        library "libstuff"
                        library "cares"
                        // ... 
                    }
                    source {
                        srcDir "jni"
                    }
                }
                // java {
                    // dependencies {
                    //     compile files("libs/httpmime-4.4-beta1.jar")
                    //     compile files("libs/FlurryAnalytics-5.1.0.jar")
                    // }
                // }
            }
        }

        android.buildTypes {
            debug {
                ndk.with {
                    debuggable = true
                }
            }
            release {
                minifyEnabled = false
                ndk.with {
                    debuggable = true
                }
            }
        }

        android.productFlavors {
            create("arm") {
                ndk.with {
                    abiFilters.add("armeabi-v7a")

                    ldLibs.addAll([file("jni/stuff/lib/libstuff.so").toString(),
                                            file("jni/c-ares/lib/libcaresARM.a").toString()])
                }
            }
            create("fat") {
                // compile and package all supported ABI
            }
        }

    } // end model

    repositories {
        mavenCentral()
    }

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

        compile 'com.android.support:support-v4:23.+'
        compile 'com.android.support:appcompat-v7:23.+'
        compile 'com.android.support:support-v13:23.+'
        compile 'com.android.support:support-annotations:23.+'

        compile 'com.squareup:otto:1.3.8'
        compile 'com.github.machinarius:preferencefragment:0.1.1'
        compile 'org.apache.httpcomponents:httpclient-android:4.3.5.1'
        compile 'com.fasterxml.jackson.core:jackson-core:2.5.+'
        compile 'com.fasterxml.jackson.core:jackson-annotations:2.5.+'
        compile 'com.fasterxml.jackson.core:jackson-databind:2.5.+'

        compile 'com.jakewharton:butterknife:7.0.1'
        compile 'com.google.guava:guava:19.0'
    }


    allprojects {
        tasks.withType(JavaCompile) {
            options.compilerArgs << "-Xlint:deprecation" << "-Xlint:unchecked"
        }
    }

欲求不満から、実験的ではないブランチに戻しましたが、古い build.gradle ファイルを使用しても、同じ jar ファイルを見つけることができません。Android Studio 2.0 Preview 6 の問題でしょうか?

他の誰かがこれを経験したことがありますか、それとも解決策がありますか? 最終的に NDK デバッグが Android Studio で正しく機能するようになると非常に便利です。この最後のハードルがなければ、私はそこにいると思います。

そのjarファイルに依存するコードを書き直す以外に、私は他に何を試すべきか途方に暮れています。また、上記の build.gradle ファイルの形式に関する提案も受け付けています。これらの新機能のドキュメントはまだ非常にまばらであり、サンプルの一部は適切な構文に関して既に古くなっているようです。

何が足りないの?

C および Cpp (mobile:compileNativeArmeabiDebugArmSharedLibraryNativeMainCpp) の手順は正常に行われていることがわかりますが、Javac は失敗します。このjarファイルのアプローチは、Apacheのhttp-mime libで過去2年ほどうまく機能しているので、なぜ突然これが問題になるのかわかりません。

    :mobile:mergeArmDebugAndroidTestAssets
    :mobile:generateArmDebugAndroidTestResValues UP-TO-DATE
    :mobile:generateArmDebugAndroidTestResources
    :mobile:mergeArmDebugAndroidTestResources
    :mobile:processArmDebugAndroidTestResources
    :mobile:generateArmDebugAndroidTestSources
    :mobile:copyArmeabi-v7aDebugArmSharedLibraryStlSo
    :mobile:compileNativeArmeabi-v7aDebugArmSharedLibraryNativeMainC
    :mobile:compileNativeArmeabi-v7aDebugArmSharedLibraryNativeMainCpp
    :mobile:linkNativeArmeabi-v7aDebugArmSharedLibrary
    :mobile:nativeArmeabi-v7aDebugArmSharedLibrary
    :mobile:stripSymbolsArmeabi-v7aDebugArmSharedLibrary
    :mobile:ndkBuildArmeabi-v7aDebugArmSharedLibrary
    :mobile:ndkBuildArmeabi-v7aDebugArmStaticLibrary UP-TO-DATE
    :mobile:copyArmeabiDebugArmSharedLibraryStlSo
    :mobile:compileNativeArmeabiDebugArmSharedLibraryNativeMainC
    :mobile:compileNativeArmeabiDebugArmSharedLibraryNativeMainCpp
    :mobile:linkNativeArmeabiDebugArmSharedLibrary
    :mobile:nativeArmeabiDebugArmSharedLibrary
    :mobile:stripSymbolsArmeabiDebugArmSharedLibrary
    :mobile:ndkBuildArmeabiDebugArmSharedLibrary
    :mobile:ndkBuildArmeabiDebugArmStaticLibrary UP-TO-DATE
    :mobile:processAndroidArmDebugMainJniLibs UP-TO-DATE
    :mobile:androidArmDebug
    :mobile:compileArmDebugJavaWithJavac
    :mobile:compileArmDebugJavaWithJavac - is not incremental (e.g. outputs have changed, no previous execution, etc.).

Apache Jar のシンボルが見つからない はい、Apache ライブラリが非推奨であることは知っていますが、これはレガシー コードであり、その事実にもかかわらず機能するはずであり、将来的に更新される予定です。

4

1 に答える 1

0

探しているインクルードを行う一般的な方法は、依存関係にあります。コンパイル fileTree(dir: 'libs', include: ['*.jar'])

ただし、この特定の問題を解決できるかどうかはわかりません。ディレクトリ構造の最上部にある libs ディレクトリに jar を配置することで、常に成功しています。jar を別の場所に置く必要がある場合は、これでうまくいきます。

repositories {
    flatDir {
        dirs '<relativePathToJar>'
    }
}

model { ... }

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}
于 2016-01-23T08:12:35.363 に答える