Android环境下NDK编译C++程序

1: 目的:

介绍 如何运用Android原生编译工具链NDK 编译C++程序 或者 相应的库。

使C++的可执行程序,可以在Android 环境下 运行起来。

2:原生工具Ndk 我这里用的是android-ndk-r10e 大家可以当官网下载最新的

 

3: 这里使用的开发环境:

Centos系统,Eclpse编写C++相关代码。

4:开发步骤

第一步:先用eclipse 建好一个可执行程序 TestNdk,一个动态库TestNdkSo,一个静态库

TestNdkA,三个工程目录。用eclipse 做为编写代码,目的是在本机开发环境方便查找程序问题。如图所示:

59bf7c4a5edf43bc85432e7c7a50f65c.png

dbe6d4436cba443f88bd9a8c7b3931dd.png

1e03b3e5fe02402ba1166b0a6ec82ef6.png

第二步:建一个项目编译shell脚本 ndkbuild.sh

内容:

#!/bin/bash



if [ $# -lt 1 ] ; then

echo "USAGE: $0 <projectpath>"

echo " e.g.: $0 /MyWork/Android/project1"

exit 1;

fi

#指定工程目录

export PROJECT_BASE=/home/testNdk/TestNdk 

#指定ndk目录

export NDK=/opt/android-ndk-r10e

export NDK_PROJECT_PATH=$PROJECT_BASE/$1

export NDK_DEBUG=1

#指定编译脚本

export APP_BUILD_SCRIPT=./Android.mk

#指定输出目录

export NDK_OUT=$PROJECT_BASE/Out

export STRIP_CMD=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin/arm-linux-androideabi-strip



cd $PROJECT_BASE/$1

#清空和执行

if [ "$2" == "clean"  ] ; then

        $NDK/ndk-build APP_BUILD_SCRIPT=$APP_BUILD_SCRIPT NDK_OUT=$NDK_OUT  $2

else

        $NDK/ndk-build NDK_DEBUG=$NDK_DEBUG APP_BUILD_SCRIPT=$APP_BUILD_SCRIPT NDK_OUT=$NDK_OUT

fi



#将生成的文件拷贝到指定的输出目录

cp -rf $NDK_OUT/local/armeabi/lib* $PROJECT_BASE/buildOut

cp -rf $NDK_OUT/local/armeabi/TestNdk $PROJECT_BASE/buildOut

 

第三步:在每个工程目录里新建jni目录和Android.mk文件

主程序:TestNdk

fef31796eba24e908b4c4e758d12b4f3.png

 

Android.mk文件内容

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := TestNdk    #要生成的目标文件

LOCAL_CFLAGS    += -I$(LOCAL_PATH)

#下面是编译用到的参数

LOCAL_CFLAGS    += -fexceptions -frtti -fPIC

LOCAL_CFLAGS    += -pie -fPIE

LOCAL_CXXFLAGS    += -fexceptions -fpermissive -frtti -fPIC

LOCAL_CXXFLAGS    += -pie -fPIE

#引用共享库

LOCAL_SHARED_LIBRARIES    := SubSo

#引用静态库

LOCAL_STATIC_LIBRARIES    := AddA



LOCAL_LDFLAGS += -fPIE -pie

#指定编译好的库要放的目录

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/testNdk/TestNdk/Out

#编译的源文件

LOCAL_SRC_FILES := $(LOCAL_PATH)/src/TestNdk.cpp



#编译用到的头文件所在目录                                       

LOCAL_C_INCLUDES := $(LOCAL_PATH) \



#$(LOCAL_PATH)/include



#指定运行环境

TARGET_ARCH := arm

TARGET_ARCH_ABI := armeabi

#执行编译为可执行程序

include $(BUILD_EXECUTABLE)

#定义编译相关库用到的标记

MY_ADD_LIB_BUILD := 1

MY_SUB_LIB_BUILD := 1



#编译引用库自己的Android.mk文件

include $(LOCAL_PATH)/../TestNdkSo/Android.mk

include $(LOCAL_PATH)/../TestNdkA/Android.mk

JNI目录

da711bbb27414bba9602b21abfd4fec9.png

 

Application.mk内容

APP_ABI := armeabi 

# armeabi-v7a

APP_STL := gnustl_shared

APP_LDFLAGS := -L/MyWork/AndroidLib/NDK/referlib

#APP_LDFLAGS += -lssl    #这里引用了第三方库 如果不需要可以注释掉

#APP_LDFLAGS += -lcrypto

动态库:

4daf0635f6e84b4b9eff64acafc3531d.png

 

 

jni目录 Application.mk 内容如下

APP_ABI := armeabi

# armeabi-v7a

APP_STL := gnustl_shared

Android.mk 内容如下

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)   

LOCAL_MODULE    := SubSo
LOCAL_CFLAGS    += -I$(LOCAL_PATH) 

LOCAL_CFLAGS    += -fexceptions -frtti -fPIC
LOCAL_CFLAGS    += -pie -fPIE
LOCAL_CXXFLAGS    += -fexceptions -fpermissive -frtti -fPIC
LOCAL_CXXFLAGS    += -pie -fPIE

LOCAL_SRC_FILES := $(LOCAL_PATH)/CSub.cpp \
								
LOCAL_C_INCLUDES := $(LOCAL_PATH) \

TARGET_ARCH := arm
TARGET_ARCH_ABI := armeabi

include $(BUILD_SHARED_LIBRARY)

ifndef MY_SUB_LIB_BUILD
include $(LOCAL_PATH)/../TestNdkSo/Android.mk
endif

静态库:

b3b118a475a94b44a78e6a454c1fba1c.png

jni目录 Application.mk 内容如下

PP_ABI := armeabi
# armeabi-v7a
APP_STL := gnustl_shared
Android.mk 内容如下
LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)   

LOCAL_MODULE    := AddA
LOCAL_CFLAGS    += -I$(LOCAL_PATH) 

LOCAL_CFLAGS    += -fexceptions -frtti -fPIC
LOCAL_CFLAGS    += -pie -fPIE
LOCAL_CXXFLAGS    += -fexceptions -fpermissive -frtti -fPIC
LOCAL_CXXFLAGS    += -pie -fPIE

LOCAL_SRC_FILES := $(LOCAL_PATH)/CAdd.cpp
							
LOCAL_C_INCLUDES := $(LOCAL_PATH) 	
					
TARGET_ARCH := arm
TARGET_ARCH_ABI := armeabi

include $(BUILD_STATIC_LIBRARY)

ifndef MY_ADD_LIB_BUILD
include $(LOCAL_PATH)/../TestNdkA/Android.mk
Endif

 

第四步:编译

./ndkbuild.sh TestNdk

e3b963ab1acb4e62a6cda467ac8efcc0.png

生成的文件如下图所示:

 清理:./ndkbuild.sh TestNdk clean

86714ebc1248433990128777f2cf259e.png

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
首先,您需要将您的 C 代码编写好,并确保它可以在 Android 平台上编译通过。 然后,您需要在 Android Studio 中配置 NDK。在 Android Studio 中,选择 File -> Project Structure,然后选择 SDK Location。在这个页面中,您可以看到 NDK 的路径,如果您还没有安装 NDK,可以点击 Download,然后选择需要下载的版本。 接下来,您需要创建一个 JNI 文件夹,并将您的 C 代码放在其中。然后,在您的项目的 build.gradle 文件中添加以下行: ```gradle android { ... defaultConfig { ... externalNativeBuild { cmake { cppFlags "-std=c++11" // 如果需要的话 arguments "-DANDROID_PLATFORM=android-21", "-DANDROID_TOOLCHAIN=clang", "-DANDROID_STL=c++_shared" } } } ... externalNativeBuild { cmake { path "CMakeLists.txt" } } } ``` 在这个文件中,您需要指定您的 CMakeLists.txt 文件的路径,并设置一些 CMake 变量来指定您的 NDK 版本、工具链和 STL 。 最后,在您的 CMakeLists.txt 文件中,您需要指定您的 C 代码的位置,并将其编译为共享。例如: ```cmake cmake_minimum_required(VERSION 3.4.1) add_library(mylibrary SHARED src/main/jni/mylibrary.c) target_link_libraries(mylibrary android log) ``` 这个示例假设您的 C 代码位于 src/main/jni/mylibrary.c 文件中,并且它将被编译为名为 mylibrary 的共享。 您可以使用 Android Studio 的 Build -> Make Project 命令来编译您的项目和 C 代码。如果一切顺利,您将在您的项目的 build/intermediates/cmake 目录中找到您的共享

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

设备系统软件集成

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值