主要講一下具體的步驟,具體的ndk指令我就不說了,貼的文章都有:
創(chuàng)新互聯(lián)專注于企業(yè)成都營銷網(wǎng)站建設、網(wǎng)站重做改版、劍閣網(wǎng)站定制設計、自適應品牌網(wǎng)站建設、H5開發(fā)、商城網(wǎng)站制作、集團公司官網(wǎng)建設、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應式網(wǎng)頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為劍閣等各大城市提供網(wǎng)站開發(fā)制作服務。
首先是寫一個.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文件完成相應函數(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++代碼,引入即可。
有一點需要注意,標紅了已經(jīng),就是生成的.h文件函數(shù)并沒具體形參名字,只有形參類型,在.cpp文件中要加入相應的形參名字,本例為env、 obj、 in_file和out_file。
還有一點c和c++的區(qū)別,就是env的使用。
本例中C++為env-GetStringUTFChars(in_file, 0);
如果是C就應該改為(env)-GetStringUTFChars(env,in_file, 0);
調(diào)用Java類型 : C中調(diào)用Java中的String類型為 jstring;
C語言方法名規(guī)則 : Java_完整包名類名_方法名(JNIEnv *env, jobject thiz), 注意完整的類名包名中包名的點要用 _ 代替;
參數(shù)介紹 : C語言方法中有兩個重要的參數(shù), JNIEnv *env, jobject thiz ;
-- JNIEnv參數(shù) : 該參數(shù)代表Java環(huán)境, 通過這個環(huán)境可以調(diào)用Java中的方法;
-- jobject參數(shù) : 該參數(shù)代表調(diào)用jni方法的類,;
調(diào)用jni.h中的NewStringUTF方法 : 該方法的作用是在C語言中創(chuàng)建一個Java語言中的String類型對象, jni.h中是這樣定義的 jstring (*NewStringUTF)(JNIEnv*, const char*), JNIEnv 結(jié)構體中包含了 NewStringUTF 函數(shù)指針, 通過 JNIEnv 就可以調(diào)用這個方法;
完成代碼編寫后,在當前目錄下完成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)
注意標紅的是最關鍵的,LOCAL_C_INCLUDES 顧名思義是需要的頭文件的所在的目錄,那三個參數(shù)主要為了引入STL,最重要??!LOCAL_SHARED_LIBRARIES 我一直生成失敗就是沒加這個參數(shù),不光要引入頭文件,還要引入具體的lib,這就是這個字段的作用。
具體字段的作用:
-- LOCAL_PATH : 代表mk文件所在的目錄;
-- include $(CLEAR_VARS) : 編譯工具函數(shù), 通過該函數(shù)可以進行一些初始化操作;
-- LOCAL_MODULE : 編譯后的 .so 后綴文件叫什么名字;
-- LOCAL_SRC_FILES: 指定編譯的源文件名稱;
-- include $(BUILD_SHARED_LIBRARY) : 告訴編譯器需要生成動態(tài)庫;
Applicaion.mk中就一行
APP_STL = stlport_static
表示使用stl靜態(tài)庫。
注意:我用了STL,大家沒有用STL的當然不用引入這些啦~
ndroid Studio升級到2.2之后,我們可以先配置好NDK開發(fā)的一些所需工具,如圖,在SDK Tools中勾選安裝CMake、LLDB、NDK。
CMake: 外部構建工具。如果你準備只使用 ndk-build 的話,可以不使用它。
LLDB: Android Studio上面調(diào)試本地代碼的工具。
Android Studio自帶DEMO了解CMAKE
Android Studio升級到2.2版本之后,在創(chuàng)建新的project時,界面上多了一個Include C++ Support的選項。勾選它之后將會創(chuàng)建一個默認的C++與JAVA混編的Demo程序。就讓我們先來看看這個官方標準Demo吧。
開始之前最好先下載好NDK,見NDK開發(fā) 從入門到放棄(一:基本流程入門了解),即在Project Structure界面Android NDK location處下載或選擇正確的路徑?;蛘呤褂蒙戏教峁┑墓ぞ甙惭b方法來進行下載。否則,創(chuàng)建的新project也會報錯,需要配置好后clean。
File - New - New Project,在如下界面中勾選Include C++ Support,然后一路 Next,直到 Finish 為止即可。
項目打開后我們查看目錄結(jié)構,與常規(guī)項目不同的是多了.externalNativeBuild文件夾、cpp文件夾、CMakeLists.txt文件,如下圖:
這三個東西都是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)注冊的方式,動態(tài)注冊的方式代碼同傳統(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文件中我們需要注意的是下面這三個地方。兩個library的名字(需一致)以及一個cpp文件的路徑,彼此需要對應一致,當我們自己定義library以及自己創(chuàng)建cpp文件時需要對應修改。
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++源代碼文件,只不過擴展名不同而已,內(nèi)部文件格式與txt一樣。
其實最笨也是最好用的辦法就是:將.cpp文件擴展名改為.txt,在手機中進行編輯整理后,可以再將擴展名改回來。
這應該是對付這種文件最好的辦法。
這篇文章的內(nèi)容會涉及以下前置 / 相關知識,貼心的我都幫你準備好了,請享用~
這篇文章偏底層,難免有寫錯的地方還請你多多斧正哦~
Android 系統(tǒng)包括三種不同類型的內(nèi)存:RAM、zRAM 和 ROM:
對于內(nèi)核來說,無論是內(nèi)核進程還是用戶進程,說到底都是 task_struct 結(jié)構體的一個實例。task_struct 也叫進程描述符(process descriptor),里面記錄了進程相關的所有信息。
在 task_struct 中有一個 mm_struct 的數(shù)據(jù)結(jié)構,也叫內(nèi)存描述符(memory descriptor),里面記錄了 Linux 進程內(nèi)存管理的所有信息。mm_struct 定義在 linux/mm_types.h 頭文件中,其中有一個頁(page)的數(shù)據(jù)結(jié)構:
—— 圖片引用自網(wǎng)絡
頁(Page)是 Linux 內(nèi)核進行內(nèi)存管理的基本單位,通常一個頁的大小為 4 KB 。根據(jù)頁面是否使用分為 “可用頁” 和 “已使用頁” 兩種,其中已使用頁可以分為以下類別:
緩存頁是指有存儲器中的文件支持的內(nèi)存,分為兩種: 私有頁 共享頁 :
匿名頁是沒有存儲器中的文件支持的內(nèi)存(例如由設置了 MAP_ANONYMOUS 標志的 mmap() 進行分配)
為了避免應用濫用內(nèi)存,Android 系統(tǒng)會限制應用可以申請的最大堆內(nèi)存,超過此限制就會拋出 OOM 異常。Android 設備出廠后,最大堆內(nèi)存就已經(jīng)確定,相關的配置位于系統(tǒng)根目錄 /system/build.prop 文件中,我們可以通過命令查看:
在 App 虛擬機啟動時,會讀取 /system/build.prop 文件的配置,源碼位于: AndroidRuntime.cpp
需要注意的是,配置 dalvik.vm.heapgrowthlimit 限制的僅僅是 Java 堆內(nèi)存,本地內(nèi)存不受其限制的。換句話說,應用可以使用的最大內(nèi)存其實是可以大于最大堆內(nèi)存的。
在確定進程占用了多少內(nèi)存時,必須考慮多個進程共享頁的情況。在 Linux 里,一個進程占用的內(nèi)存有四種指標,分別是:
一般來說內(nèi)存占用大小有如下規(guī)律:VSS = RSS = PSS = USS。
—— 圖片引用自 Android Developers
—— 圖片引用自 —— sunsky303 著
關于輸出信息的具體分析,建議直接看 Gityuan 的這篇文章: 《Android 內(nèi)存分析命令》 ,已經(jīng)寫得非常詳細了。
cocos2d-x在win32上開發(fā)出來的代碼還需要交叉編譯后才能生成android可以使用的包,具體操作見這個文檔 另:使用cocos2d-x引擎的優(yōu)勢在于便于移植性。其開發(fā)出的C++代碼只要在各上只要稍加改動就可以使用。
當前名稱:androidcpp的簡單介紹
分享URL:http://www.rwnh.cn/article42/dsigjec.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、、搜索引擎優(yōu)化、微信公眾號、軟件開發(fā)、響應式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)