ndk-bundle Android.mk 编译库和应用程序

参考 libusb-master 源码中的Android.mk ,构建一个通用的编译工程。

该方法无需启动Android studio ,用 ndk-bundle 命令编译库或应用程序。

 

第一步: 添加ndk到系统环境变量

 

第二步: 修改 jni 目录中的Android.mk  Application.mk  src.mk ,编译自己的工程

demo:

jni/Android.mk

LOCAL_PATH:= $(call my-dir)
include $(LOCAL_PATH)/src.mk

 

jni/Application.mk

# "armeabi-v7a" , "x86" , "arm64-v8a" , "x86_64" , "all"
#APP_ABI := all

APP_ABI := armeabi-v7a arm64-v8a

# Workaround for MIPS toolchain linker being unable to find liblog dependency
# of shared object in NDK versions at least up to r9.
APP_PLATFORM := android-19

#APP_CFLAGS    C编译器参数 -std=c99
#APP_CPPFLAGS  C++编译器参数 -std=c++11

# stlport_static 静态链接; stlport_shared 动态链接; gnustl_static
APP_STL = gnustl_static


APP_LDFLAGS +=  -llog -pie -fPIE
APP_CFLAGS += -pie -fPIE -lpthread -lutils -lcutils
APP_CPPFLAGS += -std=c++11
# debug  release  
APP_OPTIM := debug

 

jni/src.mk

LOCAL_PATH:= $(call my-dir)

APP_LIBMIDAVSERVER_V3 := $(LOCAL_PATH)/..

#print log
$(warning 'current path: ', $(APP_LIBMIDAVSERVER_V3))

##############

include $(CLEAR_VARS)

# 添加源文件
LOCAL_SRC_FILES := \
	$(APP_LIBMIDAVSERVER_V3)/src/test.cpp

#添加头文件所在目录
LOCAL_C_INCLUDES += \
	$(APP_LIBMIDAVSERVER_V3)/..


#导出动态库的头文件
LOCAL_EXPORT_C_INCLUDES := \
	$(APP_LIBMIDAVSERVER_V3)/include

#链接编译选项
LOCAL_CFLAGS := -Wno-error=format-security -Wall -O2 -fPIC -DLINUX -DCRYPTO -DUSE_POLARSSL -DDEBUG

#链接依赖库
# LOCAL_LDFLAGS += -L$(APP_LIBMIDAVSERVER_V3)/lib/$(TARGET_ARCH_ABI) -lavformat -lpolarssl -lJson

LOCAL_MODULE := ndktest
LOCAL_MODULE_PATH := $(APP_LIBMIDAVSERVER_V3)/bin

# "PREBUILT_SHARED_LIBRARY"  "BUILD_EXECUTABLE" "BUILD_SHARED_LIBRARY"
include $(BUILD_EXECUTABLE)

src/test.cpp

#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

int main(void)
{
    string line;
    vector<string> v;
    fstream iofp("/sdcard/1.txt",ios::in | ios::out | ios::binary);
    // char x[6]="";

    if(!iofp)
    {
        cout << "Open the file failure...\n";
        exit(0);
    }

    while(iofp >> line)
        v.push_back(line);

    for(int i = 0; i < v.size(); i++)
    {
        cout << i << ": " << v[i] << endl;
    }

    return 0;
}

第三步:编译

#cd jni
#ndk-build

ubuntu用脚本编译

#!/bin/bash

# lib-name
MY_LIBS_NAME=my_libs
# lib-path 源码路径
MY_DIR=$(pwd)
MY_SOURCE_DIR=$(pwd)/src
MY_JNI_DIR=$(pwd)/jni
ANDROID_SDK=/home/my_user/Android/Sdk
# Android studio 的 Cmake 路径
CMAKE_PATH=${ANDROID_SDK}/cmake/3.6.4111459
export PATH=${CMAKE_PATH}/bin:$PATH
# NDK 路径
NDK_PATH=${ANDROID_SDK}/ndk-bundle
export PATH=${NDK_PATH}/bin:$PATH

build_bin() {

    echo "-------------------start build $1-------------------------"

    ANDROID_ARCH_ABI=$1    # armeabi armeabi-v7a x86 mips
    CFALGS="$2"

    echo "path==>$PATH"
    echo "build_dir==>$BUILD_DIR"
    echo "ANDROID_ARCH_ABI==>$ANDROID_ARCH_ABI"
    echo "CFALGS==>$CFALGS"
	rm -rf ${MY_DIR}/libs
	rm -rf ${MY_DIR}/obj
	cd ${MY_JNI_DIR}
	${NDK_PATH}/ndk-build
#    mkdir -p ${BUILD_DIR}

    echo "-------------------$1 build end-------------------------"
}

build_bin

 

第四步 :运行

# cd ../libs/armeabi-v7a
# adb remount
# adb push ndktest /system/bin/
# adb shell

dev:/ # ndktest

 

补充:低于 Android 5 版本的系统

Android 5 之后的系统开启验证 PIE 安全机制,系统会检验可执行文件和本地库是否基于 PIE 编译出的。

在低于 Android 5的系统中添加编译参数 PIE ,会导致可执行文件和本地库无法运行,Application.mk 做如下调整。

本例中 Application.mk 添加了参数  -pie -fPIE

APP_PLATFORM := android-19 # Android API 版本
# 编译参数 -pie -fPIE
APP_LDFLAGS +=  -llog -pie -fPIE
APP_CFLAGS += -pie -fPIE -lpthread -lutils -lcutils

Android 5 对应的是 API 版本是 : android-21

如果目标机器的 Android 版本低于 Android 5 删除编译参数  -pie -fPIE

APP_PLATFORM  # 指定 Android API 版本
APP_LDFLAGS   # 删除参数 -pie -fPIE
APP_CFLAGS    # 删除参数 -pie -fPIE

 

源码下载链接: https://download.csdn.net/download/qq_38907791/10933717

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值