androidcpp
A. 請問有android開發環境的cpp編譯器嗎
編譯bootloader和linux Kernel是採用的是獨立的ARM交叉編譯器,可以在 \10.4.69.249androidepoarm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 獲得。編譯Android根文件系統和SDK使用的是Android系統自帶的交叉編譯環境。
使用如下命令安裝交叉編譯器,建議安裝在 /usr/local/ 目錄下(需具有root許可權)。
[root]$ cd /usr/local/
[root]$ tar xjvf /arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
將交叉編譯器的路徑添加到對應用戶名的.bash_profile 文件中。
[root]$ cd
[root]$ vim .bash_profile
修改其中的PATH一行,在末尾增加交叉編譯器的路徑,例如:
PATH=$PATH:/usr/local/bin/arm-2008q3/bin
運行如下命令檢查交叉編譯器是否安裝成功,得到如下結果表示安裝已經成功。
[root]$ arm-none-linux-gnueabi-gcc ?version
arm-none-linux-gnueabi-gcc (Sourcery G++ Lite 2008q3-72) 4.3.2
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for ing conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
B. android用cmake怎麼導入cpp文件夾,undifined reference to
ndroid Studio升級到2.2之後,我們可以先配置好NDK開發的一些所需工具,如圖,在SDK Tools中勾選安裝CMake、LLDB、NDK。
CMake: 外部構建工具。如果你准備只使用 ndk-build 的話,可以不使用它。
LLDB: Android Studio上面調試本地代碼的工具。
Android Studio自帶DEMO了解CMAKE
Android Studio升級到2.2版本之後,在創建新的project時,界面上多了一個Include C++ Support的選項。勾選它之後將會創建一個默認的C++與java混編的Demo程序。就讓我們先來看看這個官方標准Demo吧。
開始之前最好先下載好NDK,見NDK開發 從入門到放棄(一:基本流程入門了解),即在Project Structure界面Android NDK location處下載或選擇正確的路徑。或者使用上方提供的工具安裝方法來進行下載。否則,創建的新project也會報錯,需要配置好後clean。
File -> New -> New Project,在如下界面中勾選Include C++ Support,然後一路 Next,直到 Finish 為止即可。
項目打開後我們查看目錄結構,與常規項目不同的是多了.externalNativeBuild文件夾、cpp文件夾、CMakeLists.txt文件,如下圖:
這三個東西都是NDK部分:
1. .externalNativeBuild文件夾:cmake編譯好的文件, 顯示支持的各種硬體等信息。系統生成。
2. cpp文件夾:存放C/C++代碼文件,native-lib.cpp文件是該Demo中自帶的,可更改。需要自己編寫。
3. CMakeLists.txt文件:CMake腳本配置的文件。需要自己配置編寫。
Gradle中也有兩處不同:
java代碼:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Example of a call to a native method
TextView tv = (TextView) findViewById(R.id.sample_text);
tv.setText(stringFromJNI());
}
/**
* A native method that is implemented by the 'native-lib' native library,
* which is packaged with this application.
*/
public native String stringFromJNI();
// Used to load the 'native-lib' library on application startup.
static {
System.loadLibrary("native-lib");
}
}2223
從native-lib.cpp的代碼中我們能看到它使用的是靜態注冊的方式,動態注冊的方式代碼同傳統JNI。
#include <jni.h>
#include <string>
extern "C"
jstring
Java_com_example_person_myapplication_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}12345678910111234567891011
CMakeLists.txt文件中我們需要注意的是下面這三個地方。兩個library的名字(需一致)以及一個cpp文件的路徑,彼此需要對應一致,當我們自己定義library以及自己創建cpp文件時需要對應修改。
C. 關於ANDROID和NDK:外部的CPP文件如何通過NDK編譯成so文件。
eclipse配置NDK環境
D. android調試cpp代碼時,報錯:Target selection failed.localhost:5039:有大俠給幫忙解決下么
調試時,沒選擇目標
E. 為啥Android下用到的.cpp中的sizeofwchar
暈,打個回車,結果發表了。我重新敘述下問題。我的android工程要用到C++代碼。在cygwin下gdb調試時發現sizeof(wchar_t)的結果是4,我看網上說是可以通過-fshort-wchar 來解決,於是我在mk文件中加入了下面這句話 LOCAL_CPP_FLAGS := -fshort-wchar 但是調試時發現還是佔用4個位元組。而在 Cygwin下通過vi ,新建一個.cpp文件,裡面cout << sizeof(wchar) << endl; 得出的結果卻是2。 求解,先謝謝啦 查看原帖>>
F. 如何讓工程調用的是android的.cpp而不是調用的cocos2dx的.cpp
cocos2d-x在win32上開發出來的代碼還需要交叉編譯後才能生成android可以使用的包,具體操作見這個文檔 另:使用cocos2d-x引擎的優勢在於便於移植性。其開發出的C++代碼只要在各上只要稍加改動就可以使用。
G. 用gcc/g++如何編譯android工程中的.c/.cpp程序,如何查看android工程師.c/.cpp文件需要的依賴及如何解決
目前暫不支持開發工具編譯C、c++代碼生成so文件,應該後續版本會有的。.so 為共享庫,是shared object,用於動態連接的,和dll差不多,可以這樣調用so文件:得到/usr/java/jdk1.5.0_13/jre/lib/i386,將SO文件放在該目錄下運行java程序,輸出了由C語言函數計算出的結果以引擎自帶的HelloCpp為例配置C++的的自動編譯。在eclipse中導入hellocpp工程。操作路徑:eclipse--file--import工程導入後,右擊工程--properties取消CDT builder。然後點擊New新建一個我們自己的builder,選擇program。指定ndk-build.cmd來編譯我們的項目,下面的工作路徑將作為參數傳入給ndk-build.cmd添加NDK_MODULE_PATH變數,注意要寫兩個路徑[cocos2d-x安裝目錄和其目錄下\cocos2dx\platform\third_party\android\prebuilt],用分號分開最後點OK保存。因為不是執行build_native.sh編譯本地代碼,所以別忘了手動拷貝下hellocpp工程下resource中的資源到android工程assets.可以在命令行下編譯多個C/CPP文件,通過cl -c命令來編譯類文件,編譯成obj文件後,你可以使用lib命令將其編譯為lib文件,然後使用link命令連接多個obj文件。默認生成的可執行文件的名稱是命令中第一個obj文件的名稱,具體參考代碼如下:
H. 如何調試android NDK 交叉編譯的cpp文件
主要講一下具體的步驟,具體的ndk指令我就不說了,貼的文章都有:
首先是寫一個.java文件,本例中是HprofDumper.java
具體如下:
public class HprofDumper {
public native boolean hprofDumper(String filename, String outname);
}
然後用命令javac HprofDumper.java 生成.class文件
再用javah HprofDumper 生成相應的.h文件
生成的.h文件如下
#include
#ifndef _Included_HprofDumper
#define _Included_HprofDumper
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT jboolean JNICALL Java_HprofDumper_hprofDumper
(JNIEnv *, jobject, jstring, jstring);
#ifdef __cplusplus
}
#endif
#endif
然後只需要在對應的.cpp文件完成相應函數即可,核心代碼如下:
#include "HprofDumper.h"
#include "hprof.h"
JNIEXPORT jboolean JNICALL Java_HprofDumper_hprofDumper
(JNIEnv *env, jobject obj, jstring in_file, jstring out_file)
{
const char *filename = env->GetStringUTFChars(in_file, 0);
const char *outname = env->GetStringUTFChars(out_file, 0);
return hprof_mp(filename, outname);
}
其中hprof_mp是純c++代碼,引入即可。
有一點需要注意,標紅了已經,就是生成的.h文件函數並沒具體形參名字,只有形參類型,在.cpp文件中要加入相應的形參名字,本例為env、 obj、 in_file和out_file。
還有一點c和c++的區別,就是env的使用。
本例中C++為env->GetStringUTFChars(in_file, 0);
如果是C就應該改為(env)->GetStringUTFChars(env,in_file, 0);
調用Java類型 : C中調用Java中的String類型為 jstring;
C語言方法名規則 : Java_完整包名類名_方法名(JNIEnv *env, jobject thiz), 注意完整的類名包名中包名的點要用 _ 代替;
參數介紹 : C語言方法中有兩個重要的參數, JNIEnv *env, jobject thiz ;
-- JNIEnv參數 : 該參數代表Java環境, 通過這個環境可以調用Java中的方法;
-- jobject參數 : 該參數代表調用jni方法的類,;
調用jni.h中的NewStringUTF方法 : 該方法的作用是在C語言中創建一個Java語言中的String類型對象, jni.h中是這樣定義的 jstring (*NewStringUTF)(JNIEnv*, const char*), JNIEnv 結構體中包含了 NewStringUTF 函數指針, 通過 JNIEnv 就可以調用這個方法;
完成代碼編寫後,在當前目錄下完成Android.mk和Application.mk的編寫
首先是Android.mk
本例中為:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hprof-mper
LOCAL_C_INCLUDES += external/stlport/stlport
LOCAL_C_INCLUDES += bionic
LOCAL_C_INCLUDES += bionic/libstdc++/include
LOCAL_SRC_FILES := HprofDumper.cpp \
xx.cpp \
xx.cpp \
xx.cpp \
xx.cpp \
xx.cpp \
xx.cpp \
xxx.cpp
LOCAL_SHARED_LIBRARIES := libstlport
include $(BUILD_SHARED_LIBRARY)
注意標紅的是最關鍵的,LOCAL_C_INCLUDES 顧名思義是需要的頭文件的所在的目錄,那三個參數主要為了引入STL,最重要!!LOCAL_SHARED_LIBRARIES 我一直生成失敗就是沒加這個參數,不光要引入頭文件,還要引入具體的lib,這就是這個欄位的作用。
具體欄位的作用:
-- LOCAL_PATH : 代表mk文件所在的目錄;
-- include $(CLEAR_VARS) : 編譯工具函數, 通過該函數可以進行一些初始化操作;
-- LOCAL_MODULE : 編譯後的 .so 後綴文件叫什麼名字;
-- LOCAL_SRC_FILES: 指定編譯的源文件名稱;
-- include $(BUILD_SHARED_LIBRARY) : 告訴編譯器需要生成動態庫;
Applicaion.mk中就一行
APP_STL = stlport_static
表示使用stl靜態庫。
注意:我用了STL,大家沒有用STL的當然不用引入這些啦~
I. 為啥Android下用到的.cpp中的sizeof(wchar_t)佔用四個位元組
暈,打個回車,結果發表了。我重新敘述下問題。我的android工程要用到C++代碼。在cygwin下gdb調試時發現sizeof(wchar_t)的結果是4,我看網上說是可以通過-fshort-wchar 來解決,於是我在mk文件中加入了下面這句話 LOCAL_CPP_FLAGS := -fshort-wchar 但是調試時發現還是佔用4個位元組。而在 Cygwin下通過vi ,新建一個.cpp文件,裡面cout << sizeof(wchar) << endl; 得出的結果卻是2。 求解,先謝謝啦