初探Android NDK開(kāi)發(fā)

之前就學(xué)過(guò)c++,android上用得少就放下了,閑來(lái)無(wú)事重新拾起來(lái)
我的環(huán)境配置:mac + android studio 3.0.1
已經(jīng)下載好ndk并且配置好了,不是重點(diǎn),略。

開(kāi)始

根據(jù)自己之前有的一點(diǎn)經(jīng)驗(yàn),先在gradle.properties文件中加上

android.useDeprecatedNdk=true

然后在module的build.gradle文件defaultConfig節(jié)點(diǎn)加上

    ndk {
            // 模塊名稱(chēng)
            moduleName = "fffff"
            // 指定編譯平臺(tái),更多平臺(tái)信息 參見(jiàn)https://developer.android.com/ndk/guides/abis.html#sa
            abiFilters "armeabi", "armeabi-v7a"
        }

搞定之后使用native關(guān)鍵字寫(xiě)JNI接口,不要在意類(lèi)名

public class JJJJ {

    static {
        System.loadLibrary("fffff");
    }

    public static native String ddd(String key);
}

下一步就是生成.h文件了,看了網(wǎng)上的幾個(gè)方法,參數(shù)都比較長(zhǎng),記不住啊
找了一種偷懶的方法
在studio自帶的命令行中輸入

cd app/src/main/java/

進(jìn)到j(luò)ava目錄,執(zhí)行

javah com.yuan.nfc.JJJJ

其中com.yuan.nfc.JJJJ 是你的JNI接口類(lèi)的完成包名,執(zhí)行完后會(huì)在java目錄下生成一個(gè).h文件,自己在main目錄新建一個(gè)jni文件夾,把生成的.h文件拖過(guò)去
新建一個(gè).c文件,引入生成的.h文件,并把.h文件中的方法復(fù)制到.c文件中,補(bǔ)全參數(shù)

#include "com_yuan_nfc_JJJJ.h"



JNIEXPORT jstring JNICALL Java_com_yuan_nfc_JJJJ_ddd (JNIEnv *env, jclass jcls, jstring jcontent){
    return *env ->  NewStringUTF(env," this is a native fun");
}

然后寫(xiě)一個(gè)Android.mk文件,


完成后的目錄結(jié)構(gòu)圖

一切完成,當(dāng)你編譯的時(shí)候會(huì)發(fā)現(xiàn)報(bào)錯(cuò)了

* What went wrong:
Execution failed for task ':app:compileDebugNdk'.
> Error: Flag android.useDeprecatedNdk is no longer supported and will be removed in the next version of Android Studio.  Please switch to a supported build system.
  Consider using CMake or ndk-build integration. For more information, go to:
   https://d.android.com/r/studio-ui/add-native-code.html#ndkCompile
   To get started, you can use the sample ndk-build script the Android
   plugin generated for you at:
   /Users/macbook-HCI/GitHub/Nfc/app/build/intermediates/ndk/debug/Android.mk
  Alternatively, you can use the experimental plugin:
   https://developer.android.com/r/tools/experimental-plugin.html
  To continue using the deprecated NDK compile for another 60 days, set 
  android.deprecatedNdkCompileLease=1523343802768 in gradle.properties

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

* Get more help at https://help.gradle.org

大概意思就是,android.useDeprecatedNdk=true 這樣已經(jīng)過(guò)期了,可以使用CMake或ndk構(gòu)建集成。如果還要繼續(xù)用就在gradle.properties 文件中設(shè)置android.deprecatedNdkCompileLease = 1523342056769



事實(shí)證明這樣設(shè)置并無(wú)卵用

改用CMake吧

在SDK Manager中安裝CMake


在module的defaultConfig節(jié)點(diǎn)下添加

externalNativeBuild {
            cmake {
                cppFlags ""
                abiFilters "armeabi", "armeabi-v7a"
            }
        }

在android節(jié)點(diǎn)下添加

externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }

在app目錄下添加一個(gè)CMakeLists.txt文件,內(nèi)容為

cmake_minimum_required(VERSION 3.4.1)


add_library(
             javac
             SHARED
             src/main/jni/javac.c )

第一行指定CMake版本,add_library中的第一行為so文件的名字,第三行為c文件的路徑

JNI接口類(lèi)

public class JJJJ {

    static {
        System.loadLibrary("javac");
    }

    public static native String ddd(String key);

}

在ddd方法上直接alt+return ,選擇第一個(gè)回車(chē),自動(dòng)生成c文件



完整文件結(jié)構(gòu)圖

直接調(diào)用測(cè)試



編譯運(yùn)行


Screenshot_2018-04-10-15-44-58.png

可以調(diào)用成功。
最后發(fā)現(xiàn)有一個(gè)問(wèn)題,就是改變編譯生成的so文件名時(shí),需要clean一下,否則會(huì)生成重復(fù)的so文件打包進(jìn)apk中
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容