主要講一下具體的步驟,具體的ndk指令我就不說了,貼的文章都有:
創(chuàng)新互聯(lián)專注于企業(yè)成都營銷網(wǎng)站建設(shè)、網(wǎng)站重做改版、劍閣網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5開發(fā)、商城網(wǎng)站制作、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為劍閣等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
首先是寫一個(gè).java文件,本例中是HprofDumper.java
具體如下:
public class HprofDumper {
public native boolean hprofDumper(String filename, String outname);
}
然后用命令javac HprofDumper.java 生成.class文件
再用javah HprofDumper 生成相應(yīng)的.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
然后只需要在對(duì)應(yīng)的.cpp文件完成相應(yīng)函數(shù)即可,核心代碼如下:
#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_dump(filename, outname);
}
其中hprof_dump是純c++代碼,引入即可。
有一點(diǎn)需要注意,標(biāo)紅了已經(jīng),就是生成的.h文件函數(shù)并沒具體形參名字,只有形參類型,在.cpp文件中要加入相應(yīng)的形參名字,本例為env、 obj、 in_file和out_file。
還有一點(diǎn)c和c++的區(qū)別,就是env的使用。
本例中C++為env-GetStringUTFChars(in_file, 0);
如果是C就應(yīng)該改為(env)-GetStringUTFChars(env,in_file, 0);
調(diào)用Java類型 : C中調(diào)用Java中的String類型為 jstring;
C語言方法名規(guī)則 : Java_完整包名類名_方法名(JNIEnv *env, jobject thiz), 注意完整的類名包名中包名的點(diǎn)要用 _ 代替;
參數(shù)介紹 : C語言方法中有兩個(gè)重要的參數(shù), JNIEnv *env, jobject thiz ;
-- JNIEnv參數(shù) : 該參數(shù)代表Java環(huán)境, 通過這個(gè)環(huán)境可以調(diào)用Java中的方法;
-- jobject參數(shù) : 該參數(shù)代表調(diào)用jni方法的類,;
調(diào)用jni.h中的NewStringUTF方法 : 該方法的作用是在C語言中創(chuàng)建一個(gè)Java語言中的String類型對(duì)象, jni.h中是這樣定義的 jstring (*NewStringUTF)(JNIEnv*, const char*), JNIEnv 結(jié)構(gòu)體中包含了 NewStringUTF 函數(shù)指針, 通過 JNIEnv 就可以調(diào)用這個(gè)方法;
完成代碼編寫后,在當(dāng)前目錄下完成Android.mk和Application.mk的編寫
首先是Android.mk
本例中為:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hprof-dumper
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)
注意標(biāo)紅的是最關(guān)鍵的,LOCAL_C_INCLUDES 顧名思義是需要的頭文件的所在的目錄,那三個(gè)參數(shù)主要為了引入STL,最重要?。OCAL_SHARED_LIBRARIES 我一直生成失敗就是沒加這個(gè)參數(shù),不光要引入頭文件,還要引入具體的lib,這就是這個(gè)字段的作用。
具體字段的作用:
-- LOCAL_PATH : 代表mk文件所在的目錄;
-- include $(CLEAR_VARS) : 編譯工具函數(shù), 通過該函數(shù)可以進(jìn)行一些初始化操作;
-- LOCAL_MODULE : 編譯后的 .so 后綴文件叫什么名字;
-- LOCAL_SRC_FILES: 指定編譯的源文件名稱;
-- include $(BUILD_SHARED_LIBRARY) : 告訴編譯器需要生成動(dòng)態(tài)庫;
Applicaion.mk中就一行
APP_STL = stlport_static
表示使用stl靜態(tài)庫。
注意:我用了STL,大家沒有用STL的當(dāng)然不用引入這些啦~
ndroid Studio升級(jí)到2.2之后,我們可以先配置好NDK開發(fā)的一些所需工具,如圖,在SDK Tools中勾選安裝CMake、LLDB、NDK。
CMake: 外部構(gòu)建工具。如果你準(zhǔn)備只使用 ndk-build 的話,可以不使用它。
LLDB: Android Studio上面調(diào)試本地代碼的工具。
Android Studio自帶DEMO了解CMAKE
Android Studio升級(jí)到2.2版本之后,在創(chuàng)建新的project時(shí),界面上多了一個(gè)Include C++ Support的選項(xiàng)。勾選它之后將會(huì)創(chuàng)建一個(gè)默認(rèn)的C++與JAVA混編的Demo程序。就讓我們先來看看這個(gè)官方標(biāo)準(zhǔn)Demo吧。
開始之前最好先下載好NDK,見NDK開發(fā) 從入門到放棄(一:基本流程入門了解),即在Project Structure界面Android NDK location處下載或選擇正確的路徑。或者使用上方提供的工具安裝方法來進(jìn)行下載。否則,創(chuàng)建的新project也會(huì)報(bào)錯(cuò),需要配置好后clean。
File - New - New Project,在如下界面中勾選Include C++ Support,然后一路 Next,直到 Finish 為止即可。
項(xiàng)目打開后我們查看目錄結(jié)構(gòu),與常規(guī)項(xiàng)目不同的是多了.externalNativeBuild文件夾、cpp文件夾、CMakeLists.txt文件,如下圖:
這三個(gè)東西都是NDK部分:
1. .externalNativeBuild文件夾:cmake編譯好的文件, 顯示支持的各種硬件等信息。系統(tǒng)生成。
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");
}
}12345678910111213141516171819202122231234567891011121314151617181920212223
從native-lib.cpp的代碼中我們能看到它使用的是靜態(tài)注冊(cè)的方式,動(dòng)態(tài)注冊(cè)的方式代碼同傳統(tǒng)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文件中我們需要注意的是下面這三個(gè)地方。兩個(gè)library的名字(需一致)以及一個(gè)cpp文件的路徑,彼此需要對(duì)應(yīng)一致,當(dāng)我們自己定義library以及自己創(chuàng)建cpp文件時(shí)需要對(duì)應(yīng)修改。
Download Cocos2d-x
Download cocos2d-x and unzip it. We could simply unzip it on the root directory of your home folder. After unzipping, double click the cocos2d-xfolder and you should have a structure like this:
Download JDK, SDK and NDK
For developing Android games Java is a must have toolkit.
check your Java version.
java -version
Hopefully you see results similar to: (although your version may be slightly different.)
java version "1.8.0_05"
Java(TM) SE Runtime Environment (build 1.8.0_05-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.5-b02, mixed mode)
If not, you need to download and install Java before proceeding JDK
Download the Android SDK.
ADT Bundle For Mac
ADT Bundle For Windows (32-bit)
ADT Bundle For Windows (64-bit)
ADT Bundle For Linux (32-bit)
ADT Bundle For Linux (64-bit)
The bundle includes the newest Android SDK version plus an Eclipse version with Android Development Tool included. This is all you need.
After downloading it, unzip the package at ~/AndroidDev directory. The folder contains two folders: *sdk* and *eclipse*.
You can launch Eclipse and install other SDK versions, if needed. Here is an example:
Download NDK. Always use the latest version. This article version is r9d.
After downloading it, unzip the package at the same location of the Android SDK. In our case, it is under the *~/AndroidDev* directory.
Verify Your Environment
verify that *Python 2.7* is installed and it is accessible:
python --version in your Terminal (or cmd on Win32) and it will give you the following result:
$ python --version
Python 2.7.5
If not, you need to download and install Python before proceeding.
Hombrew brew install python
Python.org
Install and verify Apache Ant
Hombrew brew install ant
Apache.org
verify that Ant is found, simply execute:
$ ant
Buildfile: build.xml does not exist!
Build failed
Setup Environment Variables
Run setup.py to configure your Android development environment. This will set the necessary environment variables needed. If you haven't configured this environment before, you will be prompted to enter paths for variables that are not found.
Caution: You must not use the ~ sign. Use the full path to your home directory. Otherwise, the scripts will fail due to error path value.
In your cocos2d-x directory runpython setup.py and you will get the following results:
*COCOS2D_CONSOLE_ROOT* environment variable to point to the bin directory under ~/cocos2d-x/tools/cocos2d-console directory.
*NDK_ROOT* environment variable to point to the location of where you put the NDK. (i.e android-ndk-r9d/)
*ANDROID_SDK_ROOT* environment variable to point to the location of where you put the adt-bundle. Example /Users/guanghui/AndroidDev/adt-bundle-mac-x86_64-20130522/sdk/. The adt-bundle-mac-x86_64-xxxx, the xxxx number maybe different. So please note this non-trival difference.
*ANT_ROOT* environment variable to point to the location of where you put apache-ant-x.x.x. The apache-ant-x.x.x, the x.x.x number maybe different. So please note this non-trival difference.
When all environment variables are correctly configured, you should let them take effect.
On *nix systems, you could issue the following commands:
source ~/.bash_profile
on win32 system, you can just close the command line windows and restart it.
Use android-build.py to build cocos2d-x samples
Change your directory to the where the android-build.py script is located. (usually cocos2d-x/build)
cd build
and then
android list targets
Notice the id in this next screen shot.
Now I can execute:
python android-build.py -p 19 cpp-tests
That's it! The script will handle everything else that you need. When finished you should get the following message:
How to deploy it on your Android phone via command line
Enable USB Debugging on your phone and then connect your phone via USB.
Change your directory to the the bin directory of testcpp android project:
cd ~/cocos2d-x/tests/cpp-tests/proj.android/bin
(Note:If your current directory is build, you could use some relative path like thiscd ../tests/cpp-tests/proj.android/bin)
Then you could use adb to install the apk to your android phone:
adb install TestsDemo-debug.apk
If it prompts you that adb is not a command, you must re-equery your ~/.bashrc file. Ensure it contains the 4 environment variables set above. You could also manually execute:
export PATH=$PATH:$ANDROID_SDK_ROOT/tools:$ANDROID_SDK_ROOT/platform-tools
You should see the following screenshot! You are done.
cpp是c++源代碼文件,只不過擴(kuò)展名不同而已,內(nèi)部文件格式與txt一樣。
其實(shí)最笨也是最好用的辦法就是:將.cpp文件擴(kuò)展名改為.txt,在手機(jī)中進(jìn)行編輯整理后,可以再將擴(kuò)展名改回來。
這應(yīng)該是對(duì)付這種文件最好的辦法。
這篇文章的內(nèi)容會(huì)涉及以下前置 / 相關(guān)知識(shí),貼心的我都幫你準(zhǔn)備好了,請(qǐng)享用~
這篇文章偏底層,難免有寫錯(cuò)的地方還請(qǐng)你多多斧正哦~
Android 系統(tǒng)包括三種不同類型的內(nèi)存:RAM、zRAM 和 ROM:
對(duì)于內(nèi)核來說,無論是內(nèi)核進(jìn)程還是用戶進(jìn)程,說到底都是 task_struct 結(jié)構(gòu)體的一個(gè)實(shí)例。task_struct 也叫進(jìn)程描述符(process descriptor),里面記錄了進(jìn)程相關(guān)的所有信息。
在 task_struct 中有一個(gè) mm_struct 的數(shù)據(jù)結(jié)構(gòu),也叫內(nèi)存描述符(memory descriptor),里面記錄了 Linux 進(jìn)程內(nèi)存管理的所有信息。mm_struct 定義在 linux/mm_types.h 頭文件中,其中有一個(gè)頁(page)的數(shù)據(jù)結(jié)構(gòu):
—— 圖片引用自網(wǎng)絡(luò)
頁(Page)是 Linux 內(nèi)核進(jìn)行內(nèi)存管理的基本單位,通常一個(gè)頁的大小為 4 KB 。根據(jù)頁面是否使用分為 “可用頁” 和 “已使用頁” 兩種,其中已使用頁可以分為以下類別:
緩存頁是指有存儲(chǔ)器中的文件支持的內(nèi)存,分為兩種: 私有頁 共享頁 :
匿名頁是沒有存儲(chǔ)器中的文件支持的內(nèi)存(例如由設(shè)置了 MAP_ANONYMOUS 標(biāo)志的 mmap() 進(jìn)行分配)
為了避免應(yīng)用濫用內(nèi)存,Android 系統(tǒng)會(huì)限制應(yīng)用可以申請(qǐng)的最大堆內(nèi)存,超過此限制就會(huì)拋出 OOM 異常。Android 設(shè)備出廠后,最大堆內(nèi)存就已經(jīng)確定,相關(guān)的配置位于系統(tǒng)根目錄 /system/build.prop 文件中,我們可以通過命令查看:
在 App 虛擬機(jī)啟動(dòng)時(shí),會(huì)讀取 /system/build.prop 文件的配置,源碼位于: AndroidRuntime.cpp
需要注意的是,配置 dalvik.vm.heapgrowthlimit 限制的僅僅是 Java 堆內(nèi)存,本地內(nèi)存不受其限制的。換句話說,應(yīng)用可以使用的最大內(nèi)存其實(shí)是可以大于最大堆內(nèi)存的。
在確定進(jìn)程占用了多少內(nèi)存時(shí),必須考慮多個(gè)進(jìn)程共享頁的情況。在 Linux 里,一個(gè)進(jìn)程占用的內(nèi)存有四種指標(biāo),分別是:
一般來說內(nèi)存占用大小有如下規(guī)律:VSS = RSS = PSS = USS。
—— 圖片引用自 Android Developers
—— 圖片引用自 —— sunsky303 著
關(guān)于輸出信息的具體分析,建議直接看 Gityuan 的這篇文章: 《Android 內(nèi)存分析命令》 ,已經(jīng)寫得非常詳細(xì)了。
cocos2d-x在win32上開發(fā)出來的代碼還需要交叉編譯后才能生成android可以使用的包,具體操作見這個(gè)文檔 另:使用cocos2d-x引擎的優(yōu)勢(shì)在于便于移植性。其開發(fā)出的C++代碼只要在各上只要稍加改動(dòng)就可以使用。
當(dāng)前名稱:androidcpp的簡(jiǎn)單介紹
分享URL:http://aaarwkj.com/article42/dsigjec.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、、搜索引擎優(yōu)化、微信公眾號(hào)、軟件開發(fā)、響應(yīng)式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)