㈠ 我有個 安卓手機 下載了個文件查看器,程序顯示有查看cpp文件的功能,但是我卻打不開cpp文件.
cpp是c++源代碼抄文件,只不過擴展襲名不同而已,內部文件格式與txt一樣。
其實最笨也是最好用的辦法就是:將.cpp文件擴展名改為.txt,在手機中進行編輯整理後,可以再將擴展名改回來。
這應該是對付這種文件最好的辦法。
㈡ 用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文件的名稱,具體參考代碼如下:
㈢ 如何調試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的當然不用引入這些啦~