AS 配置使用NDK

1.工具準備

Android Studio 3.0.1
SDK Tools中安裝SDK版本:16.1
安裝:LLDB,c/c++調試器
安裝:CMake 編譯C/C++生成.so的構建工具

2.新建一個Android工程

在Greate Android Project時勾選Include C++ support
在Customize C++ Support時選擇默認的Toolchain Default
會自動生成兩個文件
cpp/native-lib.cpp cpp目錄是放置c/c++代碼
CMakeLists.txt:cmake插件的配置文件,用來指導c/c++如何編譯成so文件
在eclipse中是用Android.mk來配置的
官方主推:CMake + CMakeLists.txt來構建庫
1)定義庫的名稱,類型及要編譯的源代碼

add_library( # 編譯生成的庫的名稱,最終會在前面加上lib libnative-lib.so
             native-lib

             # 生成的庫的類型,有SHARED,STATIC,MODULE
             SHARED

             # 要編譯的源代碼文件多個文件用空格分開
             src/main/cpp/native-lib.cpp )

2)包含要編譯源碼的頭文件

# 注意這裏指定的是頭文件的目錄
include_directories(src/main/cpp/include/)

3)使用NDK裏的api,鏈接動態預編譯好的庫

find_library( # Sets the name of the path variable.
              log-lib

              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log )
#鏈接到native-lib庫中
target_link_libraries( # Specifies the target library.
                       native-lib

                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )

3.編譯運行項目

在編譯運行項目後在project視圖下可以看到在build下多了一個android-profile目錄
profile-xxxx.json編譯的版本信息
運行後在TextView中出現Hello from C++
以上是模板生成的
生成的庫文件在
./app/build/intermediates/cmake/debug/obj/x86/libnative-lib.so
./app/build/intermediates/cmake/debug/obj/arm64-v8a/libnative-lib.so
同樣的程序代碼爲了兼容不同的CPU,需要爲不同的ABI構建不同的庫文件
armeabi設備只兼容armeabi;
armeabi-v7a設備兼容armeabi-v7a、armeabi;
arm64-v8a設備兼容arm64-v8a、armeabi-v7a、armeabi;
X86設備兼容X86、armeabi;
X86_64設備兼容X86_64、X86、armeabi;
mips64設備兼容mips64、mips;
mips只兼容mips;

4.自定義一個java文件生成所需要的接口函數

1)MathTool.java 在java文件中建立native方法和加載庫
public class MathTool {
    static {
        System.loadLibrary("math-lib");
    }

    public static native int add(int i, int j);
    public static native int sub(int i, int j);

}
通過alt+enter鍵在native-lib.cpp中自動生對應的方法使編譯能通過
2)native-lib.cpp
extern "C"
JNIEXPORT jint JNICALL
Java_com_bshui_ndktest_MathTool_add(JNIEnv *env, jclass type, jint i, jint j) {
   //實現相關的代碼
    return i+j;

}extern "C"
JNIEXPORT jint JNICALL
Java_com_bshui_ndktest_MathTool_sub(JNIEnv *env, jclass type, jint i, jint j) {
    jint ret = 0;
    ret = i-j;
    return ret;

}

3)修改CMakeLIsts.txt
add_library( # Sets the name of the library.
             math-lib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             src/main/cpp/native-lib.cpp )
target_link_libraries( # Specifies the target library.
                       math-lib

                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )
4)Android 應用測試引用
 TextView tv = (TextView) findViewById(R.id.sample_text);
        int sum,sub;
        sum = MathTool.add(5,10);
        sub = MathTool.sub(5,10);
        tv.setText("sum(5,10)="+sum+" sub(5,10)="+sub);

5.其它項目引用

只需提供.so和.jar

1)在libs目錄下新建arm64-v8a把對應的libmath-lib.so導入
2)把classes.jar放入libs目錄下
導出class.jar, 原工程New Module-->Android Library
注意包名爲com.bshui.ndktest,與生成native的java同包名
編譯後生成class.jar包
3)build.gradle app的android中加入
sourceSets {
        main {
            jniLibs.srcDir 'libs'
        }
    }
4)在工程中調用api
tv = (TextView)findViewById(R.id.tv);
int sum = MathTool.add(10,20);
int sub = MathTool.sub(20,10);
tv.setText("sum(10,20)="+sum+" sub(20,10)="+sub);

這裏寫圖片描述

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