Android学习之NDK开发

本文介绍了Android开发中的JNI和NDK。JNI是Java本地编程接口,实现Java与C/C++通信;NDK是本地开发工具集。还说明了安装所需工具(CMake、LLDB、NDK)的方法,以及如何创建项目进行NDK开发测试,完成简单的ndk开发只需配置好CMakeLists.txt文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JNI

Java Native Interface(Java 本地编程接口),一套编程规范.提供了若干的 API 实现了 Java 和其他语言的通信(主要是 C/C++)。

Java 可以通过 JNI 调用本地的 C/C++ 代码,本地的 C/C++ 代码也可以调用 java 代码。

Java 通过 C/C++ 使用本地的代码的一个关键性原因在于 C/C++ 代码的高效性。

NDK

Native Development Kit(本地开发工具),一系列工具的集合.

提供了一系列的工具,帮助开发者快速开发 C/C++,极大地减轻了开发人员的打包工作。

一、安装所需工具

1、 打开Android Studio,找到SDK Manager

2、在SDK Manager的SDK Tools找到CMake、LLDB、NDK选中下载安装。

安装完成后就可以在File->Project Structure->SDK Location中就看到Android NDK location中看到安装好的ndk路径。

NDK也可以不在此下载安装,也可以自行去官网下载,然后手动配置Android NDK location的路径,比如:D:\test\android-ndk-r14b

NDK:这套工具集允许为 Android 使用 C 和 C++ 代码。

CMake:一款外部构建工具,可与 Gradle 搭配使用来构建原生库。如果只计划使用 ndk-build,则不需要此组件。

LLDB:一种调试程序,Android Studio 使用它来调试原生代码。

简单介绍一个CMake:

从AndroidStudio2.2以上就添加了Cmake方式来编译NDK代码。默认是使用Cmake方式来编译。可以节省大量的工作。CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程),能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。

二、使用

在所需的工具安装完成后,就可以创建一个项目来进行测试。

1、新建一个 project,在填写Application Name的时候勾选Include C++ support复选框,然后一直next到finish创建出项目。

2、项目创建完成后就可以看到比普通项目多了一些内容:

    src/main/cpp文件夹是用来存放C/C++源码
    
    CMakeLists.txt:CMake 脚本配置文件

    app/build.gradle文件中也多了一些内容

接下来介绍一下多出的东西:

(1) app/build.gradle

android {
            ...
            defaultConfig {
                ...
                externalNativeBuild {
                    cmake {
                        cppFlags ""
                    }
					ndk {   //设置CPU平台,默认是没有的,表示生成所有平台的so,也可以针对单一平台设置
                        abiFilters "arm64-v8a"
                    }
                }
            }
            buildTypes {
                ...
            }
            externalNativeBuild {
                cmake {   //表示CMakeLists文件路径
                    path "CMakeLists.txt"
                }
            }
}	

(2) CMakeLists.txt

# 指定cmke版本  
cmake_minimum_required(VERSION3.4.1)  
# add_library()命令用于向CMake添加依赖源文件或库  
# 指令需传入三个参数(函数库名称、库类型、依赖源文件相对路径)  
add_library(  # 生成函数库的名称,即libnative-lib.so或libnative-lib.a(lib和.so/.a默认缺省)  
        native-lib  
        # 生成库类型:动态库为SHARED,静态库为STATIC  
        SHARED  
        # 依赖的c/cpp文件(相对路径)  
        src/main/cpp/native-lib.cpp 
)  
# find_library()命令用于定位NDK中的库  
# 需传入两个参数(path变量、ndk库名称)  
find_library(  # 设置path变量的名称,这里为NDK中的日志库  
            log-lib  
            #指定cmake查询库的名称  
            #即在ndk开发包中查询liblog.so函数库,将其路径赋值给log-lib  
            log 
)  
#target_link_libraries()命令用于指定要关联到的原生库的库  
target_link_libraries(# 指定目标库,与上面指定的函数库名一致  
            native-lib  
            # 链接的库,根据log-lib变量对应liblog.so函数库  
            ${log-lib} 
)
		
这是默认生成的CMakeLists文件,除此之外CMakeLists文件还有一些其他的设置:
		
#头文件的加载 ,括号内是.h文件路径
include_directories(src/main/cpp/include)

		
#set 设置变量,方便使用,设置一个变量DIR,路径为${CMAKE_SOURCE_DIR}/libs。${CMAKE_SOURCE_DIR}表示的是CMakeLists.txt所在的目录。
set(DIR ${CMAKE_SOURCE_DIR}/libs)
		
		
#变量的使用
${DIR}
		
#加载第三方动态库
CMakeLists文件中默认加载c原文件的方式,针对第三方动态库的加载配置如下:
		
第一种 是在main目录下新建jniLibs目录,并将so文件放在其中。以“libavcodec-57.so”为例
		
		   add_library( avcodec-57 SHARED IMPORTED)
        
		    set_target_properties( avcodec-57
                   PROPERTIES IMPORTED_LOCATION
                   ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libavcodec-57.so)
				   
		    ${ANDROID_ABI}就是表示各种平台,armeabi或x86。
           
		    add_library( xx ) “配置加载动态库的方式 avcodec-57”动态库的名称,“SHARED ”表示加载的是动态库。

			set_target_properties(xx)配置加载动态库的路径

			可以把相同的路径设置为变量DIR,使得配置如下:

			set(DIR ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/)

			add_library( avcodec-57 SHARED IMPORTED)

			set_target_properties( avcodec-57
                   PROPERTIES IMPORTED_LOCATION
                   ${DIR}/libavcodec-57.so)
		
		
第二种 放置到libs目录,这种方式与第一种的区别就是需要在build.gradle中配置加载路径。其他一样。
		
		    在app/build.gradle中配置加载路径:
			
			android {
                ...
				sourceSets {
                    main {
                        jniLibs.srcDirs = ['libs']
                    }
                }
            }
			
最后依然需要进行链接target_link_librarie,在target_link_librarie添加动态库的名称。
			
#设置生成的so动态库最后输出的路径	

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI})	

默认不用设置,会将生成的so打入到apk中,如果需要将so文件给第三方使用,可以设置,这样就可以在jinLibs文件夹下看到生成的so文件了。

<3> 在项目构建完成后,可以看到src/main/cpp文件夹下看到默认生成了一个native-lib.cpp的C++文件,返回了一个String类型。

此时运行就可以在界面看到返回的内容。这样一个简单的ndk开发就完成了,只需要配置好CMakeLists.txt文件即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值