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);

这里写图片描述

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