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 [build_891qepz0rctnrwl3xcb2ddug5$_run_closure1$_closure5@29f50b4f] 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++去做實現和調用。

本文JNINdk源碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章