在Android Studio

时间:2015-09-07 17:20:09

标签: android android-studio android-ndk

我知道有相关的答案,但它们已经过时了。我有Android Studio 1.3,已经下载了Android NDK。当我运行应用时,它崩溃并在findLibrary returned null中提供Logcat。我发现这是因为没有.so库文件(如果我错了,请纠正我)。我的问题是 - 如何在Android Studio中生成.so文件?

我拥有什么 -

  • Android Studio 1.3稳定版
  • Gradle 1.5
  • Android实验插件0.2

注意 - 如果必须从.soCygwin构建库CMD文件,请告诉我该怎么做。

2 个答案:

答案 0 :(得分:14)

将NDK连接到Android Studio需要几个步骤。目前,支持标记为 experimental ,AS开始捆绑在IDE中下载NDK的功能。默认情况下,当源和/或库放在Android.mkApplication.mk文件夹中时,AS使用通用jnijniLibs。以下说明会覆盖这些默认值,以提供更多自定义功能。

简而言之,您需要:

  1. 为源和库创建默认的jnijniLibs目录。
  2. 告诉Android Studio在哪里可以找到您的NDK构建链
  3. 告诉gradle如何编译以及放置libs的位置
  4. 创建Android.mk文件以指定构建和链接顺序
  5. 创建一些来源
  6. 创建目录

    /app/src/main内创建jnijniLibs目录。

    更新local.properties

    local.properties文件中,添加类似于:

    的行

    ndk.dir=/home/nathan/development/bin/android-ndk-r10e

    更新build.gradle

    这是指模块级别,而不是应用程序级别。这确保我们在上面的步骤中定义了构建路径,并消除了Android Studio自动调用ndk-build的能力。使用以下示例作为指南。

    apply plugin: 'com.android.model.application'
    
    model {
    android {
        compileSdkVersion = 23
        buildToolsVersion = "23.0.0"
    
        defaultConfig.with {
            applicationId = "com.example.hellojni"
            minSdkVersion.apiLevel = 4
            targetSdkVersion.apiLevel = 23
        }
    }
    
    compileOptions.with {
        sourceCompatibility=JavaVersion.VERSION_1_7
        targetCompatibility=JavaVersion.VERSION_1_7
    }
    
    /*
     * native build settings
     */
    android.ndk {
        moduleName = "hello-jni"
        /*
         * Other ndk flags configurable here are
         * cppFlags += "-fno-rtti"
         * cppFlags += "-fno-exceptions"
         * ldLibs    = ["android", "log"]
         * stl       = "system"
         */
    }
    android.buildTypes {
        release {
            minifyEnabled = false
            proguardFiles  += file('proguard-rules.txt')
        }
    }
    android.productFlavors {
        // for detailed abiFilter descriptions, refer to "Supported ABIs" @
        // https://developer.android.com/ndk/guides/abis.html#sa
        create("arm") {
            ndk.abiFilters += "armeabi"
        }
        create("arm7") {
            ndk.abiFilters += "armeabi-v7a"
        }
        create("arm8") {
            ndk.abiFilters += "arm64-v8a"
        }
        create("x86") {
            ndk.abiFilters += "x86"
        }
        create("x86-64") {
            ndk.abiFilters += "x86_64"
        }
        create("mips") {
            ndk.abiFilters += "mips"
        }
        create("mips-64") {
            ndk.abiFilters += "mips64"
        }
        // To include all cpu architectures, leaves abiFilters empty
        create("all")
    }
    }
    

    <强> Android.mk

    Android.mk目录

    中需要/app/src/main/jni个文件
    LOCAL_PATH := $(call my-dir)
    
    # Builds a dylib out of test.cpp
    include $(CLEAR_VARS)
    LOCAL_MODULE := test
    LOCAL_SRC_FILES := test.cpp
    LOCAL_LDLIBS := -llog
    include $(BUILD_SHARED_LIBRARY)
    

    <强> TEST.CPP

    为您的lib添加一些非常棒的C / C ++源代码。这些文件将从/app/src/main/jni开始,并将按照Android.mk

    中的说明进行编译和关联

    示例文件

    #include <jni.h>
    #include <android/log.h>
    
    static const char *SOME_TAG = "MyAwesomeTag";
    
    extern "C"
    {
    
    void
    Java_com_something_something_1android_ClassName_some_fn(JNIEnv *env, jobject obj)
    {
        __android_log_print(ANDROID_LOG_VERBOSE, SOME_TAG, "Hello from NDK :)");
    }
    
    } // End extern
    

    编译并运行。

答案 1 :(得分:9)

一年后,使用Android Studio 2.2及更高版本,您现在可以通过选择&#34;包含C ++支持&#34;免费为您完成所有这些操作。在创建新项目时。

有关详细信息,请查看:https://developer.android.com/studio/projects/add-native-code.html