版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/stalendp/article/details/79172118
android {
compileSdkVersion 23
buildToolsVersion "27.0.2"
defaultConfig {
applicationId "com.ucool.heroesarena"
minSdkVersion 16
targetSdkVersion 19
ndk {
moduleName "hcu3dplugin"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
externalNativeBuild {
ndkBuild {
path '../../MOBA_ANDROID/AndroidBuild/HeroesArena/jni/Android.mk'
}
}
splits {
abi {
// Configures multiple APKs based on screen density.
enable true
reset() // Clears the default list from all densities to no densities.
include "armeabi-v7a", "x86" // Specifies the two ABIs we want to generate APKs for.
}
}
}
NDK相关的编译
Cross Compiling C/C++ for Android
生成tool-chain环境(由于android编译的target是丰富各异的安卓硬件平台,所以ndk的编译也需要根据平台来生成编译环境,所以提供了一个命令,如下是生成arm64平台的):
./android-ndk-r12b/build/tools/make_standalone_toolchain.py --arch arm64 --install-dir ~/arm
编译的时候,可以使用如下命令:
~/arm/bin/clang -pie hello_world.c
查看编译文件的信息:
file a.out
在手机平台上运行:
adb push a.out /data/local/tmp/.
adb shell "./data/local/tmp/a.out"
#include <stdio.h>
int main () {
puts("hello world");
}
一个简单的NDK的例子
TestCurl.cpp
#include <jni.h>
extern "C" {
JNIEXPORT jstring JNICALL
Java_com_ucool_hellondk_MyNDK_stringFromJNI( JNIEnv* env,
jobject thiz ) {
return (*env)->NewStringUTF(env, "Hello from JNI ! ");
}
}
MyNDK.java
package com.ucool.hellondk;
public class MyNDK {
static {
System.loadLibrary("hello-jni");
}
public static native String stringFromJNI();
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.4.1)
add_library(hello-jni SHARED
TestCurl.cpp)
# Include libraries needed for hello-jni lib
target_link_libraries(hello-jni
android
log)
模块的build.gradle
android {
compileSdkVersion 26
// .....
externalNativeBuild {
cmake {
path 'src/main/jni/CMakeLists.txt'
}
// ndkBuild {
// path 'src/main/jni/Android.mk'
// }
}
}
安卓的ToolChain环境的准备
# Create an arm64 API 26 libc++ toolchain.
$NDK/build/tools/make_standalone_toolchain.py --arch arm64 --stl=libc++ --install-dir=my-toolchain --force
or
%NDK%/build/tools/make-standalone-toolchain.sh --arch=arm64 --stl=libc++ --install-dir=my-toolchain --force
# Add the standalone toolchain to the search path.
export PATH=$PATH:`pwd`/my-toolchain/bin
# Tell configure what tools to use.
target_host=aarch64-linux-android
export AR=$target_host-ar
export AS=$target_host-clang
export CC=$target_host-clang
export CXX=$target_host-clang++
export LD=$target_host-ld
export STRIP=$target_host-strip
# Tell configure what flags Android requires.
export CFLAGS="-fPIE -fPIC"
export LDFLAGS="-pie"
---------------------------------------------------
$ ./configure --host=arm
$ ./configure --host=arm --build=arm --with-sysroot=$ANDROID_SYSROOT
CMake的一个例子:
cmake_minimum_required(VERSION 3.4.1)
# 设置编译参数
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUSE_FILE32API")
# 设置变量
set(BROTLI_DIR "${CMAKE_CURRENT_SOURCE_DIR}/third_party/Brotli")
set(LIB_CURL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/prebuilt/libcurl")
set(H_CURL_DIR "${LIB_CURL_DIR}/include")
# 头文件相关
include_directories("." ${H_CURL_DIR} )
# 编译源文件成Library
add_library(hcu3dplugin SHARED
HcU3dPlugin.cpp
JniHelper.cpp
main.cpp
)
# 编译子文件夹
add_subdirectory(${BROTLI_DIR} )
# 添加一个编译好的library
add_library(curl STATIC IMPORTED )
set_target_properties(curl
PROPERTIES IMPORTED_LOCATION
${LIB_CURL_DIR}/libs/${ANDROID_ABI}/libcurl.a )
# 连接其他文件
target_link_libraries(hcu3dplugin
brotli
curl
android
log
z
)
CMake参考:
https://www.jetbrains.com/help/clion/quick-cmake-tutorial.html