方法&&教程:win10使用ndk交叉编译hello_world.cpp
qpython吧
全部回复
仅看楼主
level 5
KnIfER 楼主
用ndk编译用于安卓上运行的库hello_world.so.
prerequisites:
1.安装好android-ndk-r12b或者其他版本,安装有android sdk
2.安装好MinGW与配件msys
ndk
msys
从网盘分享下载解压得hello_world.cpp、makefile两个文件
度盘1o7PIsAI密码g7dn
其中hello_world.cpp:
#include <iostream>
int main(int argc,char *argv[])
{
for (int i=0;i<argc;i++)
printf("argv[%d]=%s\n",i,argv[i]);
return 0;
}
是个回显命令行参数的简单程序。
配置makefile:
用notepad++打开,将其中的NDK_ROOT变量值改成你自己的ndk根路径。android SDK根目录变量PLATFROM_ROOT如是。
#makefile for hello_world
NDK_ROOT=F:/COD/NVPACK/android-ndk-r12b
TOOLCHAINS_ROOT=$(NDK_ROOT)/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64
TOOLCHAINS_PREFIX=$(TOOLCHAINS_ROOT)/bin/arm-linux-androideabi
TOOLCHAINS_INCLUDE=$(TOOLCHAINS_ROOT)/lib/gcc/arm-linux-androideabi/4.9.x/include-fixed
PLATFROM_ROOT=$(NDK_ROOT)/platforms/android-23/arch-arm
PLATFROM_INCLUDE=$(PLATFROM_ROOT)/usr/include
PLATFROM_LIB=$(PLATFROM_ROOT)/usr/lib
MODALE_NAME=hello_world
RM=del
FLAGSMY=-I$(TOOLCHAINS_INCLUDE)\
-I$(PLATFROM_INCLUDE)\
-I$(NDK_ROOT)/sources/cxx-stl/stlport/stlport/ \
-L$(PLATFROM_LIB)\
-l$(NDK_ROOT)/sources/cxx-stl/stlport/libs/armeabi/libstlport_static.a\
-nostdlib\
-lgcc\
-Bdynamic\
-lc\
-shared
OBJS=$(MODALE_NAME).o\
$(PLATFROM_LIB)/crtbegin_dynamic.o\
$(PLATFROM_LIB)/crtend_android.o
all:
$(TOOLCHAINS_PREFIX)-gcc $(FLAGSMY) $(MODALE_NAME).cpp -o $(MODALE_NAME).so
clean:
$(RM) *.o
注意makefile的tab就是tab而不能是4个空格
编译:
双击打开msys.bat,cd 至hello_world.cpp、makefile所在目录,比如F:/video_wrkst/ndkTry/huixian
make
完成!
附gcc编译出.exe指令:
g++ hello_world.cpp -o hello_world.exe -std=c++1y
联类不穷~
2017年07月09日 09点07分 1
level 5
KnIfER 楼主
说起联类不穷,教你在c4droid上编译出等价的hello_world.so
等等,掏手机……
2017年07月09日 10点07分 2
level 5
KnIfER 楼主
MSYS2官网挂了,新的工具链:win10+ubuntu子系统+ndk-llvm-clang
makefile:
BASE_PATH := $(call my-dir)
_ARCH_PX_ := aarch64
_TARGETRI_ := aarch64-linux-android
_ARCH_CC_ := $(_TARGETRI_)21-clang
CC := $(TOOLCHAIN)/bin/$(_ARCH_CC_
AR := $(TOOLCHAIN)/bin/aarch64-linux-android-ar.exe
AR := $(TOOLCHAIN)/aarch64-linux-android/bin/ar
APP_STL:=stlport_static
FLAGSMY=\
-std=c++11 \
-arch aarch64 \
-pie -fPIE \
all: helloworld.cpp
$(CC) $(FLAGSMY) $(<) -o helloworld.so
build.sh:
export ANDROID_SDK=/mnt/d/Code/NVPACK/android_sdk
export PATH=$ANDROID_SDK/platform-tools:$PATH
export PATH=$ANDROID_SDK/tools:$PATH
export NDK=/mnt/d/Code/NVPACK/android-ndk-r21b
export NDK=/mnt/d/Code/NVPACK/android_sdk/ndk/21.0.6113669
export PATH=$NDK:$PATH
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/windows-x86_64
export SYSROOT=$TOOLCHAIN/sysroot
export ASM=$SYSROOT/usr/include/$PLATFORM
make
方法:
win10中安装ubuntu子系统、ndk21(linux 或 window 的版本都可以)
安装 bandizip, 可以在文件夹空白处右击打开命令行。
在源码目录打开命令行,运行./build.sh进行编译。
测试:(TERMUX)
科上网,安装TERMUX,等待数分钟。
将helloworld.so复制到/sdcard/Android/data/com.termux
在Termux运行测试命令:
cp /sdcard/Android/data/com.termux/helloworld.so hw.so && chmod 777 hw.so && ./hw.so
测试:(QPYTHON)
参考之前的《qpython调用c语言代码之传参》。
2020年10月22日 06点10分 3
1