导航:首页 > 操作系统 > rttiandroid

rttiandroid

发布时间:2022-05-26 11:42:42

A. 如何编译android动态链编的native c/c++code

编译环境要求:下载Android的源码,并执行完一次完整的编译。以下的所有命令均是在编译后的源码根目录下执行。

1. 编译C code
同样以hello.c为例:

#include <stdio.h>
#include <stdlib.h>

int main()
{
printf("hello, world!\n");
return 0;
}


执行以下步骤生成动态链编的binary文件:
生成目标文件:prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-gcc -I bionic/libc/arch-arm/include -I bionic/libc/include -I bionic/libstdc++/include -I bionic/libc/kernel/common -I bionic/libc/kernel/arch-arm -include system/core/include/arch/linux-arm/AndroidConfig.h -c -o hello.o hello.c
生成可执行程序:prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm- eabi-gcc -nostdlib -Bdynamic -Wl,-T,build/core/armelf.x -Wl,-dynamic-linker,/system/bin/linker -Wl,--gc-sections -Wl,-z,noreloc -o hello -Lout/target/proct/generic/obj/lib -Wl,-rpath-link=out/target/proct/generic/obj/lib -lc -lstdc++ out/target/proct/generic/obj/lib/crtbegin_dynamic.o hello.o -Wl,--no-undefined ./prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/../lib/gcc/arm-eabi/4.2.1/interwork/libgcc.a out/target/proct/generic/obj/lib/crtend_android.o

用命令file查看生成的hello文件属性:
hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), stripped
可以证明此时的hello是一个动态链编的文件。

2. 编译native c++ 代码
以hello_cpp为例:

hello_cpp.h
#ifndef HELLO_CPP_H
#define HELLO_CPP_H

class Hello
{
public:
Hello();
~Hello();
void printMessage(char* msg);
};

#endif

hello_cpp.cpp
#include <stdio.h>
#include "hello_cpp.h"

Hello::Hello()
{
}

Hello::~Hello()
{
}

void Hello::printMessage(char* msg)
{
printf("C++ example printing message: %s", msg);
}

int main(void)
{
Hello hello_obj;
hello_obj.printMessage("Hello world!\n");
return 0;
}
执行以下命令完成:
编译目标文件:prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-g++ -I bionic/libc/arch-arm/include -I bionic/libc/include -I bionic/libstdc++/include -I bionic/libc/kernel/common -I bionic/libc/kernel/arch-arm -include system/core/include/arch/linux-arm/AndroidConfig.h -fno-exceptions -fno-rtti -c -o hello_cpp.o hello_cpp.cpp
编译可执行程序:prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm- eabi-g++ -nostdlib -Bdynamic -Wl,-T,build/core/armelf.x -Wl,-dynamic-linker,/system/bin/linker -Wl,--gc-sections -Wl,-z,noreloc -o hello_cpp -Lout/target/proct/generic/obj/lib -Wl,-rpath-link=out/target/proct/generic/obj/lib -lc -lstdc++ out/target/proct/generic/obj/lib/crtbegin_dynamic.o hello_cpp.o -Wl,--no-undefined ./prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/../lib/gcc/arm-eabi/4.2.1/interwork/libgcc.a out/target/proct/generic/obj/lib/crtend_android.o

同样用file查看hello_cpp的文件属性:
hello_cpp: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), stripped

但是很不幸的是,android自带的toolchain不支持C++标准库的开发,即所有的std namespace下的类均无法使用,包括基本的string。

B. Android平台下NDK编译出现的问题,求高手指导!!

找到 ./obj/local/armeabi/libstlport_static.a 这个文件
然后 chmode 777 libstlport_static.a
然后再编译试试

C. android ndk 用什么工具

首先需要确定目标机器的指令集。
如果是 x86 的机器,用 x86-4.4.3 版本的工具链;如果是 arm 指令的,用 arm-linux-androideabi-4.4.3 版本 (x86-4.4.3 和 arm-linux-androideabi-4.4.3 位于ndk目录中)
1、gcc 的sysroot 选项
sysroot 选项设定 gcc 在编译源码的时候,寻找头文件和库文件的根目录。可以这样调用 gcc --sysroot=/tmp/gcc-arm (及其他选项)。NDK 根目录下的 platforms 目录中的各个子目录的路径都可以直接传给 gcc --sysroot=<dir>。为了简化操作,可以在linux系统的命令终端执行以下命令,设置SYSROOT环境变量,$NDK是ndk的根目录。
$ SYSROOT=$NDK/platforms/android-8/arch-arm
2、调用 NDK gcc(第1种方法)。 设置 SYSROOT之后,要把它传给 gcc 的 --sysroot 选项。由于unix/linux自带的gcc并非交叉编译工具,而我们需要使用的是ndk中提供的交叉编译工具(也是gcc),所以需要想办法让编译脚本找到ndk中的gcc,而不要去寻找系统中的gcc。而 unix/linux 系统的编译脚本常常会用 CC 环境变量来引用编译器,所以通过把 CC 设置为ndk中的gcc的路径,就能帮助编译脚本找到正确的gcc(我们还能顺便加上--sysroot选项)。
将CC 按如下设置
$ export CC="$NDK/toolchains/<name>/prebuilt/<host-system>/bin/<prefix>gcc --sysroot=$SYSROOT"
$ $CC -o foo.o -c foo.c (不必执行这一行,这条命令是调用gcc编译程序)
上面第1行之后之后,再去执行./configure 就可以编译出arm程序了。不过还需要考虑共享库的链接问题,要确保该程序没有链接ndk未提供的共享库。该方法的缺陷就是,不能使用 C++ STL(STLport 或 GNU libstdc++ ),也不能使用异常机制和RTTI。
3、调用NDK编译器(第2种方法,更简单)
android ndk 提供脚本,允许自己定制一套工具链。例如:
$NDK/build/tools/make-standalone-toolchain.sh --platform=android-5 --install-dir=/tmp/my-android-toolchain [ --arch=x86 ]
将会在/tmp/my-android-toolchain 中创建 sysroot 环境和 工具链。--arch 选项选择目标程序的指令架构,默认是为 arm。
如果不加 --install-dir 选项,则会创建 /tmp/ndk/<toolchain-name>.tar.bz2。
(执行 make-standalone-toolchain.sh --help 查看帮助。)
运行之后,这样使用:
$ export PATH=/tmp/my-android-toolchain/bin:$PATH
$ export CC=arm-linux-androideabi-gcc
$ export CXX=arm-linux-androideabi-g++
$ export CXXFLAGS="-lstdc++"
执行完以上设置环境变量的命令之后,就可以直接编译了(例如,执行 ./configure 然后 make 得到的就是 arm 程序了)。不用再设定 sysroot, CC 了。而且,可以使用 STL,异常,RTTI。
4、ABI 兼容性
ndk 同时支持 arm5 和 arm7,一般只用 arm5就好了。arm7是高端一点的,NDK 默认也是 arm5 。
推荐加上 -mthumb 选项给gcc,来生成 16-bit Thumb-1 指令。
如果要用 arm7,可以设定 CFLAGS='-march=armv7-a -mfloat-abi=softfp', 使用 Thumb-2 指令,且这两个选项不能分开!
5、警告 & 限制
5.1 Windows支持
Windows 上的NDK 工具链不依赖 Cygwin,因而速度比用 Cygwin 快一点,但是这些工具不能理解
Cygwin 的路径名(例如, /cygdrive/c/foo/bar)。只能理解 C: /cygdrive/c/foo/bar 这类路径
不过,NDK 提供的build工具能够很好地应对上述问题(ndk-build)
5.2 wchar_t 支持
wchar_t 类型仅从 Android 2.3 开始支持。
在 android-9 上, wchar_t 是 4字节。 并且 C语言库提供支持宽字符的函数
(例外:multi-byte 编码/解码 函数 和 wsprintf/wsscanf )
在android-9 以前的平台上,wchar_t 是1字节,而且宽字符函数不起作用。
建议不使用 wchar_t,提供 wchar_t 支持是为了方便移植以前的代码。
5.3 异常, RTTI 和 STL
NDK 工具链默认支持C++异常和RTTI(Run Time Type Information),可以用 -fno-exception 和 -fno-rtti 关闭(生成的机器码更小)
注意: 如果要用这两个特性,需要显式链接 libsupc++。例如: arm-linux-androideabi-g++ .... -lsupc++
NDK 提供了 libstdc++,因而可以用 STL,但需要显式链接 libstdc++ ( gcc ... -lstdc++)。不过在将来可以不用手动指定这个链接参数。

D. 如何在android app中使用STL库

方法:

1.在jni目录下新建Application.mk; 加入 APP_STL := stlport_static右边的值还可以换成下面几个:

system - 使用默认最小的C++运行库,这样生成的应用体积小,内存占用小,但部分功能将无法支持

stlport_static - 使用STLport作为静态库,这项是Android开发网极力推荐的

stlport_shared - STLport作为动态库,这个可能产生兼容性和部分低版本的Android固件,目前不推荐使用。

gnustl_static - 使用 GNU libstdc++ 作为静态库

默认情况下STLPORT是不支持C++异常处理和RTTI,所以不要出现 -fexceptions 或-frtti;如果真的需要,可以使用gnustl_static来支持标准C++的特性,但生成的文件体积会偏大,运行效率会低一些。

支持C++异常处理,在Application.mk中加入 LOCAL_CPPFLAGS +=-fexceptions这句,同理支持RTTI,则加入LOCAL_CPPFLAGS +=-frtti,这里再次提醒大家,第二条说的使用gnustl静态库,而不是stlport。

强制重新编译 STLPort ,在Application.mk中加入STLPORT_FORCE_REBUILD := true可以强制重新编译STLPort源码,由于一些原因可能自己需要修改下STLPort库,一般普通的开发者无需使用此项

2. 在要使用STL的cpp文件中包含相关的头文件,并且使用using namespace std;

E. 宝马新5系全球首发!激光大灯、48V轻混,2种外观风格你喜欢哪个

宝马中期改款5系轿车、旅行车官图正式发布!一起来看看具体有哪些变化呢?
先来看M运动套件的新5系,前脸的主要变化就是双肾格栅和大灯组了,双肾格栅的面积有所增大,更具立体化效果。下包围两侧进气口面积更大,内部用蜂窝状饰板来凸显运动感,并取消了雾灯的设计。
来看前大灯组,新5系提供配备了新型的激光大灯,现款5系灯眉处的转向灯在改款中变为了蓝色激光大灯模组,而新5系的转向灯和日间行车灯结合到了一起,原有的“勺子灯”日间行车灯变为平直的“L”型设计。
这套全新设计的轮毂要给个好评,另外这台插电式混动530e的左侧翼子板处还有充电接口,卡钳为蓝色和翼子板处的“M”标识相得益彰。
新5系的侧面设计变化并不大,而车身尺寸上,中改5系的车长增加了约30mm(1.2英寸),得益于全新设计新款5系的风阻系数低至0.27(530i)。
再来看尾部设计,新5系最大的改变就是尾灯组了,点亮之后呈倒“C”状,且具备和X3、X5等车型相类似的3D悬浮设计,转向灯和倒车灯均被移到了下方。车尾最下方的排气管造型没有变化,依旧是不规则四边形设计。
来看豪华套件的宝马新5系,其实和M运动套装的外观设计差别主要是在前后包围上,豪华套装的新5系前脸下方两侧变为三角镀铬设计,中间用熏黑饰板相连,尾部下方的包围中增加了一条镀铬条,没有M运动套装的小型扩散器。
新5系内饰的整体设计语言并没有太大变化,而这次5系车厢内升级的重点是车机系统的大升级,支持扩展型IPA智能个人助理及RSU远程软件升级,除此之外,新款5系还采用了BMW行车记录仪功能,提供至多40秒的紧急录像功能。
?
新款5系除了支持苹果CarPlay互联之外,还提供了安卓Android Auto互联功能。还配备了12.3英寸数字仪表盘和12.3英寸中控触摸屏以及iD7操作系统。
新5系还推出了基于云存储的导航解决方案,通过触控屏、iDrive旋钮、方向盘按键、语音识别、BMW智能个人助理和手势控制来实现集成式操作,同时可实现精确的实时交通信息(RTTI)展示。
另外,新5系的驾驶辅助功能也有了改进,提供包括:主动侧碰撞保护功能的车道保持助手、车道偏离警告、带制动干预的前部碰撞警告、自动限速辅助、城市制动路口警告等等,同时还将周围的车辆渲染出3D可视化效果,包括相邻车道上的轿车、公共汽车或摩托车等等。
新款宝马5系此次为所有的四缸、六缸车型(无论柴油或是汽油车型)都加入了48V轻混系统,来提升性能和燃油经济性。48V轻混系统包括启动电机和额外的电池,改善了制动能回收系统的工作方式,当驾驶员松开油门时,系统会将动能回收转化为电能。
而且在48V电池中存储的电能还将提供给12V电气系统使用,并为灯组、转向系统、动力单元、音响系统和座椅加热等供电;还可提供额外11匹(8kW)马力,让车辆更快的起步;当然只要车速低于9英里每小时(约14km/h),系统就可以关闭发动机,还能以很小的振动幅度重新快速启动。
具体到动力参数上,530车型搭载2.0T四缸发动机(B48B20O1),最大功率248hp,峰值扭矩350Nm;530e车型为燃油机+电机(12 kWh)驱动,综合最大功率288hp;540车型搭载3.0T发动机(B58B30M1),最大功率335hp,峰值扭矩450Nm;M550i搭载4.4T V8发动机,最大功率523hp,峰值扭矩750Nm,所有发动机的高精度燃油喷射压力均达到350bar。
而且,宝马此后还将会推出一款6缸插电式混动版本车型545e xDrive,其最大功率会达到394PS(388 hp),比530e增加了100hp。
本文来源于汽车之家车家号作者,不代表汽车之家的观点立场。

F. 如何用CCache加速Cocos2d-x Android版本的编译

CCache是C/C++的编译器缓存。当相同的编译被再次编译时,进行检测并通过之前编译的缓存进行编译加速。所以我们可以通过这种方法给Cocos2d-x Android的编译加速。使用这种方法,在i7 CPU的Macbook Pro Retina上编译,我们的Cocos2d-x Android工程编译时间可以从10分钟减少到30秒!!

注意:以下操作仅对Mac OS X有效。

安装
我们使用homebrew:

1

brew
install --HEAD ccache

或者通过源码安装:

1
2
3
4
5
6
7

git
clone https://github.com/jrosdahl/ccache.git
cd
ccache
./autogen.sh
./configure
make
make
install
cp
/usr/local/bin/ccache /usr/bin/

注意:默认的安装路径是 /usr/local/bin,我们需要拷贝ccache到/usr/bin/,不然ndk-build会找不到并报错

如果终端报错说找不到autoheader,这说明我们需要先安装automake:

1

brew
install automake

但是,如果如果报错是说找不到brew,我们就必须先安装brew:

1

ruby
-e "$(curl
-fsSL
https://raw.github.com/Homebrew/homebrew/go/install)"

确保ccache的路径可以被$PATH识别,运行命令:

1

ccache

如果你看到帮助信息,恭喜你,安装成功了!

在android上配置编译环境
我们必须先设置以下环境变量来使用ccache:

1
2
3
4

vim
~/.bash_profile
Add
following lines:
export
USE_CCACHE=1
export
NDK_CCACHE=/usr/local/bin/ccache

运行命令行:

1

ccache
-M 10G

这个命令将缓存大小设置为10G。当然,如果你的硬盘有足够的空间,你也可以将此设置为50G。

然后,我们跳转到NDK目录,如果你忘了这个路径,你可以使用以下命令来查看:

1

which
ndk-build

以下是我的输出结果:

1

/developer/android/android-ndk-r9b/ndk-build

所以,我的NDK_ROOT是:

1

/developer/android/android-ndk-r9b

打开文件:$NDK_ROOT/build/core/default-build-commands.mk

找到以下章节并加入ccache,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13

ifneq
($(findstring ccc-analyzer,$(CC)),)
TARGET_CC
= $(CC)
else
TARGET_CC
= ccache $(TOOLCHAIN_PREFIX)gcc #Add ccache support
endif
TARGET_CFLAGS
=
TARGET_CONLYFLAGS
=
ifneq
($(findstring c++-analyzer,$(CXX)),)
TARGET_CXX
= $(CXX)
else
TARGET_CXX
= ccache $(TOOLCHAIN_PREFIX)g++ #Add ccache support
endif
TARGET_CXXFLAGS
= $(TARGET_CFLAGS) -fno-exceptions -fno-rtti

编译cocos2d-x游戏
选择cocos2d-x根目录,运行:

1

python
build/android-build.py -p 10 cpp-tests

新建一个终端窗口,运行:

1

ccache
-s

这个命令会打印出ccache状态,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14

cache
directory /Users/heliclei/.ccache
primary
config /Users/heliclei/.ccache/ccache.conf
secondary
config (readonly) /usr/local/etc/ccache.conf
cache
hit (direct) 13588
cache
hit (preprocessed) 11145
cache
miss 696
called
for

link 1
called
for

preprocessing 14
preprocessor
error 1
can't
use precompiled header 129
no
input file 5
files
in cache 32222
cache
size 5.4 GB
max
cache size 30.0 GB

如果缓存的高速缓存命中(cache hit)和缓存大小(cache size)均为0,这就表示ccache没有运行,我们必须从新检查配置。

在Xcode中部署
配置Xcode(5.1)的ccache环境有点麻烦。我确实能调用ccache,但貌似没有增加编译速度。如果你有好的方法解决这个问题,请到github上为本篇教程提交pr!不过我们还是看看设置方法:

首先,我们添加2个自定义宏(user-defined macros)到cocos2d_libs的编译选项中:

1
2

CC=$(SOURCE_ROOT)/../tools/xcode_ccache_wrapper
LDPLUSPLUS=$(DT_TOOLCHAIN_DIR)/usr/bin/clang++

然后,我们需要在$(COCOS2dX_ROOT)/tools/路径下创建名为xcode_ccache_wrapper的脚本:

1
2
3
4

#!/bin/bash
export
CCACHE_CPP2=yes
export
CCACHE_LOGFILE=~/Desktop/ccache.log
exec
/usr/local/bin/ccache /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -Qunused-arguments
"$@"

设置完成,我们就可以快乐的在Xcode中编译了!

打开ccache.log可以查看cache工作状态。

G. android.mk怎么在jni编译时把系统头文件包含

Android.mk文件用来告知NDK Build 系统关于Source的信息。 Android.mk将是GNU Makefile的一部分,且将被Build System解析一次或多次。
所以,请尽量少的在Android.mk中声明变量,也不要假定任何东西不会在解析过程中定义。

Android.mk文件语法允许我们将Source打包成一个"moles". moles可以是:
静态库
动态库。

只有动态库可以被 install/到应用程序包(APK). 静态库则可以被链接入动态库。
可以在一个Android.mk中定义一个或多个moles. 也可以将同一份source 加进多个moles.

Build System帮我们处理了很多细节而不需要我们再关心。例如:你不需要在Android.mk中列出头文件和外部依赖文件。
NDK Build System自动帮我们提供这些信息。这也意味着,当用户升级NDK后,你将可以受益于新的toolchain/platform而不必再去修改Android.mk.

1. Android.mk语法:
首先看一个最简单的Android.mk的例子:
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c

include $(BUILD_SHARED_LIBRARY)
讲解如下:
LOCAL_PATH := $(call my-dir)
每个Android.mk文件必须以定义LOCAL_PATH为开始。它用于在开发tree中查找源文件。
宏my-dir则由Build System提供。返回包含Android.mk的目录路径。

include $(CLEAR_VARS)
CLEAR_VARS 变量由Build System提供。并指向一个指定的GNU Makefile,由它负责清理很多LOCAL_xxx.
例如:LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES等等。但不清理LOCAL_PATH.
这个清理动作是必须的,因为所有的编译控制文件由同一个GNU Make解析和执行,其变量是全局的。所以清理后才能避免相互影响。

LOCAL_MODULE := hello-jni
LOCAL_MODULE模块必须定义,以表示Android.mk中的每一个模块。名字必须唯一且不包含空格。
Build System会自动添加适当的前缀和后缀。例如,foo,要产生动态库,则生成libfoo.so. 但请注意:如果模块名被定为:libfoo.则生成libfoo.so. 不再加前缀。

LOCAL_SRC_FILES := hello-jni.c
LOCAL_SRC_FILES变量必须包含将要打包如模块的C/C++ 源码。
不必列出头文件,build System 会自动帮我们找出依赖文件。
缺省的C++源码的扩展名为.cpp. 也可以修改,通过LOCAL_CPP_EXTENSION。

include $(BUILD_SHARED_LIBRARY)
BUILD_SHARED_LIBRARY:是Build System提供的一个变量,指向一个GNU Makefile Script。
它负责收集自从上次调用 include $(CLEAR_VARS) 后的所有LOCAL_XXX信息。并决定编译为什么。

BUILD_STATIC_LIBRARY:编译为静态库。
BUILD_SHARED_LIBRARY :编译为动态库
BUILD_EXECUTABLE:编译为Native C可执行程序

2. NDK Build System变量:
NDK Build System 保留以下变量名:
以LOCAL_ 为开头的
以PRIVATE_ ,NDK_ 或者APP_ 开头的名字。
小写字母名字:如my-dir

如果想要定义自己在Android.mk中使用的变量名,建议添加 MY_前缀。

2.1: NDK提供的变量:
此类GNU Make变量是NDK Build System在解析Android.mk之前就定义好了的。
2.1.1:CLEAR_VARS:

指向一个编译脚本。必须在新模块前包含之。
include $(CLEAR_VARS)
2.1.2:BUILD_SHARED_LIBRARY:
指向一个编译脚本,它收集自从上次调用 include $(CLEAR_VARS) 后的所有LOCAL_XXX信息。
并决定如何将你列出的Source编译成一个动态库。 注意,在包含此文件前,至少应该包含:LOCAL_MODULE and LOCAL_SRC_FILES 例如:
include $(BUILD_SHARED_LIBRARY)

2.1.3:BUILD_STATIC_LIBRARY:
与前面类似,它也指向一个编译脚本,
收集自从上次调用 include $(CLEAR_VARS) 后的所有LOCAL_XXX信息。
并决定如何将你列出的Source编译成一个静态库。 静态库不能够加入到Project 或者APK中。但它可以用来生成动态库。
LOCAL_STATIC_LIBRARIES and LOCAL_WHOLE_STATIC_LIBRARIES将描述之。
include $(BUILD_STATIC_LIBRARY)

2.1.4: BUILD_EXECUTABLE:
与前面类似,它也指向一个编译脚本,收集自从上次调用 include $(CLEAR_VARS) 后的所有LOCAL_XXX信息。
并决定如何将你列出的Source编译成一个可执行Native程序。 include $(BUILD_EXECUTABLE)

2.1.5:PREBUILT_SHARED_LIBRARY:
把这个共享库声明为 “一个” 独立的模块。
指向一个build 脚本,用来指定一个预先编译好多动态库。 与BUILD_SHARED_LIBRARY and BUILD_STATIC_LIBRARY不同,
此时模块的LOCAL_SRC_FILES应该被指定为一个预先编译好的动态库,而非source file. LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt # 模块名
LOCAL_SRC_FILES := libfoo.so # 模块的文件路径(相对于 LOCAL_PATH)

include $(PREBUILT_SHARED_LIBRARY) # 注意这里不是 BUILD_SHARED_LIBRARY

这个共享库将被拷贝到 $PROJECT/obj/local 和 $PROJECT/libs/<abi> (stripped) 主要是用在将已经编译好的第三方库
使用在本Android Project中。为什么不直接将其COPY到libs/armabi目录呢?因为这样做缺陷很多。下一节再详细说明。

2.1.6: PREBUILT_STATIC_LIBRARY:预先编译的静态库。 同上。

2.1.7: TARGET_ARCH: 目标CPU架构名。如果为“arm” 则声称ARM兼容的指令。与CPU架构版本无关。

2.1.8: TARGET_PLATFORM: 目标平台的名字。

2.1.9:TARGET_ARCH_ABI
Name of the target CPU+ABI
armeabi For ARMv5TE armeabi-v7a
2.1.10:TARGET_ABI

2.2: NDK提供的功能宏:
GNUMake 提供的功能宏,只有通过类似: $(call function) 的方式来得到其值,它将返回文本化的信息。

2.2.1: my-dir: $(call my-dir):
返回最近一次include的Makefile的路径。通常返回Android.mk所在的路径。它用来作为Android.mk的开头来定义LOCAL_PATH. LOCAL_PATH := $(call my-dir)
请注意:返回的是最近一次include的Makefile的路径。所以在Include其它Makefile后,再调用$(call my-dir)会返回其它Android.mk 所在路径。 例如:
LOCAL_PATH := $(call my-dir) ... declare one mole include $(LOCAL_PATH)/foo/Android.mk LOCAL_PATH := $(call my-dir) ... declare another mole
则第二次返回的LOCAL_PATH为:$PATH/foo。 而非$PATH.

2.2.2: all-subdir-makefiles:
返回一个列表,包含'my-dir'中所有子目录中的Android.mk。
例如: 结构如下: sources/foo/Android.mk sources/foo/lib1/Android.mk sources/foo/lib2/Android.mk
在If sources/foo/Android.mk 中, include $(call all-subdir-makefiles) 那则自动include 了sources/foo/lib1/Android.mk and sources/foo/lib2/Android.mk。

2.2.3:this-makefile:
当前Makefile的路径。

2.2.4:parent-makefile:
返回include tree中父Makefile 路径。 也就是include 当前Makefile的Makefile Path。

2.2.5:import-mole:
允许寻找并inport其它moles到本Android.mk中来。 它会从NDK_MODULE_PATH寻找指定的模块名。 $(call import-mole,<name>)
2.3: 模块描述变量:
此类变量用来给Build System描述模块信息。在'include $(CLEAR_VARS)' 和 'include $(BUILD_XXXXX)'之间。必须定义此类变量。 include $(CLEAR_VARS) script用来清空这些变量。

include $(BUILD_XXXXX)收集和使用这些变量。

2.3.1: LOCAL_PATH:
这个值用来给定当前目录。必须在Android.mk的开是位置定义之。
例如: LOCAL_PATH := $(call my-dir) LOCAL_PATH不会被include $(CLEAR_VARS) 清理。

2.3.2: LOCAL_MODULE:
moles名。在include $(BUILD_XXXXX)之前,必须定义这个变量。此变量必须唯一且不能有空格。
通常,由此变量名决定最终生成的目标文件名。

2.3.3: LOCAL_MODULE_FILENAME:
可选。用来override LOCAL_MODULE. 即允许用户重新定义最终生成的目标文件名。 LOCAL_MODULE := foo-version-1 LOCAL_MODULE_FILENAME := libfoo
2.3.4:LOCAL_SRC_FILES:
为Build Moles而提供的Source 文件列表。不需要列出依赖文件。 注意:文件相对于LOCAL_PATH存放,
且可以提供相对路径。 例如: LOCAL_SRC_FILES := foo.c \ toto/bar.c
2.3.5: LOCAL_CPP_EXTENSION:
指出C++ 扩展名。(可选) LOCAL_CPP_EXTENSION := .cxx 从NDK R7后,可以写多个:
LOCAL_CPP_EXTENSION := .cxx .cpp .cc

2.3.6:LOCAL_CPP_FEATURES:
可选。用来指定C++ features。 LOCAL_CPP_FEATURES := rtti
LOCAL_CPP_FEATURES := exceptions

2.3.7:LOCAL_C_INCLUDES:
一个可选的path列表。相对于NDK ROOT 目录。编译时,将会把这些目录附上。 LOCAL_C_INCLUDES := sources/foo LOCAL_C_INCLUDES := $(LOCAL_PATH)/../foo
2.3.8: LOCAL_CFLAGS:
一个可选的设置,在编译C/C++ source 时添加如Flags。
用来附加编译选项。 注意:不要尝试在此处修改编译的优化选项和Debug等级。它会通过您Application.mk中的信息自动指定。
也可以指定include 目录通过:LOCAL_CFLAGS += -I<path>。 这个方法比使用LOCAL_C_INCLUDES要好。因为这样也可以被ndk-debug使用。

2.3.9: LOCAL_CXXFLAGS: LOCAL_CPPFLAGS的别名。
2.3.10: LOCAL_CPPFLAGS:
C++ Source 编译时添加的C Flags。这些Flags将出现在LOCAL_CFLAGS flags 的后面。

2.3.11: LOCAL_STATIC_LIBRARIES:
要链接到本模块的静态库list。(built with BUILD_STATIC_LIBRARY)

2.3.12: LOCAL_SHARED_LIBRARIES:
要链接到本模块的动态库。

2.3.13:LOCAL_WHOLE_STATIC_LIBRARIES:

静态库全链接。 不同于LOCAL_STATIC_LIBRARIES,类似于使用--whole-archive

2.3.14:LOCAL_LDLIBS:

linker flags。 可以用它来添加系统库。 如 -lz: LOCAL_LDLIBS := -lz

2.3.15: LOCAL_ALLOW_UNDEFINED_SYMBOLS:

2.3.16: LOCAL_ARM_MODE:
缺省模式下,ARM目标代码被编译为thumb模式。每个指令16位。如果指定此变量为:arm。 则指令为32位。 LOCAL_ARM_MODE := arm 其实也可以指定某一个或者某几个文件的ARM指令模式。
2.3.17: LOCAL_ARM_NEON:
设置为true时,会讲浮点编译成neon指令。这会极大地加快浮点运算(前提是硬件支持)
只有targeting 为 'armeabi-v7a'时才可以。

2.3.18:LOCAL_DISABLE_NO_EXECUTE:

2.3.19: LOCAL_EXPORT_CFLAGS:
定义这个变量用来记录C/C++编译器标志集合,
并且会被添加到其他任何以LOCAL_STATIC_LIBRARIES和LOCAL_SHARED_LIBRARIES的模块的LOCAL_CFLAGS定义中 LOCAL_SRC_FILES := foo.c bar.c.arm
注意:此处NDK版本为NDK R7C.(不同NDK版本,ndk-build所产生的Makefile并不完全相同)

H. 如何快速的学习C++

大一学习的c++,工作之后也一直用的c++。

1. 涵盖c++入门到精通的图书列表

《The C programming language》必读
《C++ Primer》,号称是一本可以让你从C或java程序员转为一个真正的C++程序员的入门参考书,必读。
《The C++ programming language》,C++之父,人称B教主着作,在看过C++ primer后,应该可以跳章选读。
《Think in c++》,网上说此书的中文版翻译质量奇差,推荐看影印版,选读。
《Effective c++》,类似 Effective java,讲的是最佳实践,程序员必读。


《More effective c++》,上书的补充。
《The C++ standard library》,会写C,不会用标准库怎么行。这就跟java程序员不会用java.util包一样,必读。
《Effective STL》,STL库的最佳实践。Effective C++作者又一力作,必读。
《The annotated STL source》,STL源码分析,这本书应该算是深入/精通类了,选读。
《Generic programming and STL》,号称C++编程里,就是跟模板,泛型打交道,那么精通泛型是势在必行。

《C++ Template》,C++模板编程,代码复用的经验之道,必读。

《Exceptional C++》,跟Effective C++类似,属于最佳实践和难题解析,书中列出了许多应用场景和实例代码供读者揣摩,选读。

《More Exceptional C++》,上书的补充。

《Exceptional C++ Style》,上上书的补充

《Inside The C++ Object Model》,有了上面这些书做铺垫,那么终于可以读此神书了。它会带你游览C++对象模型的底层实现机制。读完此书,任何C++代码看起来如同行云流水,必读。

2. 优秀的C/C++开源项目(阅读代码)

OS:Linux kernel LVS、Linux应用程序

DB:Mysql、PostgreSQL

Complier:VM、GCC

Framework:OpenSip、SipProxy、

Net:ACE(Java Mina、Netty)、TCP/IP、HTTP协议栈

Cache:Memcached、Redis、

Library:STL(java util package)、Boost、Qt(UI)、

balance:Apache、Nginx

GSL

地址:https://github.com/microsoft/GSL

Boost文档

地址:https://www.boost.org/doc/libs/

wxWidgets官网

地址:http://wxwidgets.org/

gtkmm

地址:https://www.gtkmm.org/en/

CopperSpice

地址:https://www.copperspice.com/

Qt

地址:https://www.qt.io/Eigen

地址:http://eigen.tuxfamily.org/index.php?title=Main_Page#Documentation

Plot utils

地址:https://www.gnu.org/software/plotutils/

Asio

地址:https://think-async.com/Asio/

POCO

地址:https://pocoproject.org/

abseil

地址:https://abseil.io/

C++开源库汇总列表

地址:https://en.cppreference.com/w/cpp/links/libs

除了这些开源项目,也可以找一些免费的公开课,那这里也推荐一个ACM金牌大佬讲授的免费C++课程,可以去体验一下:

学好C++才是入职大厂的敲门砖! 当年要是有这课,我的C++也不至于这样

已失效

3.C++语法讲解

I. android studio 项目在添加jni后,调试很慢

一、前提条件

1、Android studio版本最好2.0以上,在1.5上试过各种问题

2、Ndk版本最好是android-ndk-r10d,ndk的路径要在项目根目录下的local.properties下指定,例如ndk.dir=F:\android-ndk-r10d

二、加入gradle-experimental插件

1、打开项目根目录下的build.gradle文件,加入

classpath "com.android.tools.build:gradle-experimental:0.7.0"

如下图:

2、默认使用的是com.android.application这个插件,如果要进行jni调试最好换掉这个插件,也就是使用之前加入的gradle-experimental插件,据说不换好像也行,但是没试过。下面贴出具体的配置:

[java]view plain

阅读全文

与rttiandroid相关的资料

热点内容
ios大文件夹图标 浏览:624
生的计划pdf 浏览:711
oppoa93加密便签在哪查找 浏览:16
两个数字的加减乘除运算编程 浏览:227
给手机加密码忘记了怎么办 浏览:601
单片机运算符 浏览:297
移动端微信商城源码 浏览:442
编程猫下一个背景在哪里 浏览:358
javaclasstype 浏览:238
乐高编程和乐高课的延伸 浏览:356
苹果手机怎么切换app美国账号 浏览:865
编译程序输入一个字符串 浏览:407
圆命令画法 浏览:308
如果给电脑e盘文件加密 浏览:802
javaswing项目 浏览:778
androidsdksetup 浏览:1005
pdf怎么设置中文 浏览:128
安卓手机用什么软件看伦敦金 浏览:966
魅族文件夹无名称 浏览:792
苏黎世无人机算法 浏览:876