参考 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