【Android】NDK开发

1 篇文章 0 订阅

Native Development Kit 原生开发工具包,支持C/C++

1、NDK优缺点

在这里插入图片描述

2、一步一步实现

简介:https://juejin.im/post/6844904031509282829

1、在main下新建cpp文件夹(与java文件夹平级),放入.cpp和.h以及1个CMakeLists.txt文件

如果cpp文件中其实使用c语言实现的,那么.h中的每个函数前都用extern “C” ;

如果不止一个cpp文件,那么CMakeLists.txt中:

add_library(rsa // 最终生成的库名称为librsa.so
            SHARED // 生成的是动态链接库
            rsa_A.cpp keysInit_A.cpp bn_A.cpp)//这里并排写

2、在build.gradle中重新指定CMakeLists.txt的路径

android {
	...
    externalNativeBuild {
        cmake {
//            path "CMakeLists.txt"
            path "src/main/cpp/rsa/CMakeLists.txt"
        }
    }
    ...

3、点击Android Studio右侧的Gradle窗口中,指定module的externalNativeBuildRelease任务(也可以gradlew执行命令)。执行成功后,我们就能在app/build/intermediates/cmake/release/obj/目录下看到生成的动态库文件,应该会有4个文件夹:arm64-v8a, armeabi-v7a, x86, x86_64。

4、到cpp文件夹下新建native-lib.cpp文件

 暂时不写入内容,但是后面会写的

5、到main下新建jniLibs文件夹,将上述4个文件夹剪切到jniLibs文件夹中,文件夹名称一定只能是jniLibs。

6、 在app文件夹下新建CMakeLists.txt,配置依赖的动态库

 cmake_minimum_required(VERSION 3.4.1)
    add_library(
            native-lib
            SHARED
            src/main/cpp/native-lib.cpp)
    
    find_library(
            log-lib
            log)
    
    set(rsa-lib ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${CMAKE_ANDROID_ARCH_ABI}/librsa.so)
    
    message("rsa-lib is ${rsa-lib}")
    
    target_link_libraries(
            native-lib
            ${rsa-lib}
            ${log-lib})

7、在app的build.gradle中切换回步骤5建立的CMakeLists.txt`

    ...
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
//            path "src/main/cpp/rsa/CMakeLists.txt"
        }
    }
    ...

8、点击Android Studio右侧的Gradle,选择工程名,app, Tasks, other, 指定externalNativeBuildRelease任务(也可以gradlew执行命令),出现下列字样,表明编译成功:

> Task :app:externalNativeBuildRelease
Build native-lib_armeabi-v7a
ninja: Entering directory `E:\AndroidStudio_Projects\TEST\AndroidCppSafe\app\.cxx\cmake\release\armeabi-v7a'
[1/2] Building CXX object CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o
[2/2] Linking CXX shared library ..\..\..\..\build\intermediates\cmake\release\obj\armeabi-v7a\libnative-lib.so
Build native-lib_arm64-v8a
ninja: Entering directory `E:\AndroidStudio_Projects\TEST\AndroidCppSafe\app\.cxx\cmake\release\arm64-v8a'
[1/2] Building CXX object CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o
[2/2] Linking CXX shared library ..\..\..\..\build\intermediates\cmake\release\obj\arm64-v8a\libnative-lib.so
Build native-lib_x86
ninja: Entering directory `E:\AndroidStudio_Projects\TEST\AndroidCppSafe\app\.cxx\cmake\release\x86'
[1/2] Building CXX object CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o
[2/2] Linking CXX shared library ..\..\..\..\build\intermediates\cmake\release\obj\x86\libnative-lib.so
Build native-lib_x86_64
ninja: Entering directory `E:\AndroidStudio_Projects\TEST\AndroidCppSafe\app\.cxx\cmake\release\x86_64'
[1/2] Building CXX object CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o
[2/2] Linking CXX shared library ..\..\..\..\build\intermediates\cmake\release\obj\x86_64\libnative-lib.so

BUILD SUCCESSFUL in 23s
2 actionable tasks: 2 executed
15:23:30: Task execution finished 'externalNativeBuildRelease'.

9、在MainActivity.java中定义native函数并调用:

public native String getABI();

......
Log.i(TAG, "onCreate: getABI = " + getABI());
......

10、在MainActivity中添加静态类:

public class MainActivity extends AppCompatActivity {

	...
// Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
    }
    ...
}

11、在module的build.gradle中进行配置,以指定ABI运行

android{
    ...
    defaultConfig{
        ...
        ndk{
            // abiFilters "armeabi-v7a" // 指定以armeabi-v7a运行
            abiFilters "arm64-v8a","armeabi-v7a"  // 以arm64-v8a、armeabi-v7a中,目标设备支持的最优ABI运行
            // abiFilters "arm64-v8a" // 指定以arm64-v8a运行
        }
        ...
    }
    ...
}

12、native函数:

#include <jni.h>
#include "abi/abi.h"

extern "C" JNIEXPORT jstring
JNICALL
Java_com_wsy_jnidemo_MainActivity_getABI(
        JNIEnv *env,
        jobject /* this */) {
    return  env->NewStringUTF(getAbi());
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值