1. 程式人生 > >Android Jni+Ndk使用步驟

Android Jni+Ndk使用步驟


1、準備Android studio 開發工具
    1
2、開啟Android studio 建立一個專案
    2
3、然後配置NDK:
    下載依賴:SDK Manager → Android SDK → SDK Tools → ( 勾選CMake 、 勾選LLDB ; 這倆不需要翻牆)→ apply下載
    3.1
    1:翻牆後:SDK Manager → Android SDK → SDK Tools → 勾選NDK → apply下載
     3.2
    2:未翻牆:https://developer.android.google.cn/ndk/downloads/ 瀏覽器手動下載,下載完成複製路徑

4、右鍵專案 → Open Module → Android NDK Location → OK → 等待編譯
    注意路徑不允許有空格
    4.1
    4.2
    4.3
    4.4
    
5、檢視根目錄local.properties裡面多了NDK路徑
    5.1
6、在根目錄gradle.properties下面加上 android.useDeprecatedNdk=true
    6.1
7、在app下的build.gradle新增 ndk節點
    7.1
    
8、編寫jni介面
    I:建立一個JNIUtil的類,編寫一個native方法
    8.1
    II: Build -> Make Project 同步報錯:
            Could not find method ndk() for arguments [

[email protected]] on object of type com.android.build.gradle.AppExtension
    8.II
        解決:
            把 ndk 放在 defaultConfig 裡面

            defaultConfig {
                ndk {
                    moduleName "JniNdk" //輸出.so的名字
                }
            }
    8.II2
    III: 繼續(Build -> Make Project):
        在/JniTestSample/app/build/intermediates/下面多了一個classes資料夾.我們可以開啟AS下面的Terminal進入到classes下面的debug資料夾下
    
    IV: 在Terminal執行一下javah com.bai.jnindk.JNIUtil
    javah是後面是我的包名,執行完這句話以後在classes下會有個.h檔案生成出來
    8.iv


    8.IV4
    8.IV5
9、實現.h對應的方法
    I: 在main檔案下新建一個jni資料夾
    9.I
    II:把剛才生成的.h檔案移動到新建的jni資料夾下,緊接著我們建立一個c++類來實現.h裡面宣告的方法.
       我們把.h類純複製一份,把字尾名改成.cpp。裡面實現它的方法,我們在方法裡面返回一句話;
    9.II
    9.II1
    III: 在JNIUtil裡面加上
       static{
           System.loadLibrary("JniNdk");//名字注意,和build.gradle ndk節點下面的名字一樣
       }
    9.III
10、呼叫C++裡的方法:
    JNIUtil jniUtil = new JNIUtil();
    TextView showName = (TextView) findViewById(R.id.showResult);
    showName.setText(jniUtil.getName());
    10.I
11、執行一下,找.so檔案(執行之前,把Terminal控制檯切出去,不要停留在build/intermediates/classes)

    .so檔案位置:build/intermediates/ndk/debug/lib

    11
12、有了.so檔案就可以直接用作庫來用,test一下
    I:建一個新的專案TestJni,然後在 app下的 build.gradle新增
        sourceSets {
            main {
                jniLibs.srcDirs = ['libs']
            }
        }
    12.I
    II:把剛才生成的libJniNdk.so檔案放入lib包下,然後同步
    12.II
    III:建立呼叫.so裡的方法
        因為.so裡的方法是 Java_com_bai_jnindk_JNIUtil_getName 所以呼叫.so方法的類也要在對應的包下

        com.bai.jnindk/JNIUtil/getName  這三樣對應的一個都不可以錯,不然找不到會報錯
    

    IV:MainActivity呼叫
        JNIUtil jniUtil = new JNIUtil();
        TextView showName = (TextView) findViewById(R.id.showResult);
        showName.setText(jniUtil.getName());

OK,成功!具體要實現各項功能,大家自己用C++去做實現和呼叫。