導航:首頁 > 操作系統 > 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相關的資料

熱點內容
兩個數字的加減乘除運算編程 瀏覽:221
給手機加密碼忘記了怎麼辦 瀏覽:598
單片機運算符 瀏覽:297
移動端微信商城源碼 瀏覽:442
編程貓下一個背景在哪裡 瀏覽:357
javaclasstype 瀏覽:238
樂高編程和樂高課的延伸 瀏覽:354
蘋果手機怎麼切換app美國賬號 瀏覽:865
編譯程序輸入一個字元串 瀏覽:407
圓命令畫法 瀏覽:308
如果給電腦e盤文件加密 瀏覽:802
javaswing項目 瀏覽:778
androidsdksetup 瀏覽:1005
pdf怎麼設置中文 瀏覽:128
安卓手機用什麼軟體看倫敦金 瀏覽:966
魅族文件夾無名稱 瀏覽:792
蘇黎世無人機演算法 瀏覽:876
核桃編程和小碼王的融資 瀏覽:686
微積分教材pdf 瀏覽:728
寫python給微信好友發消息 瀏覽:340