QLGame 2d Engine win端已經實現了一個動物的動畫了,初步的東西已經完成,考慮在Android端也實現這些基本的東西,這樣跨平臺的引擎也就實現了!
要在Android下編程,首先要實現從Assets文件夾讀取資源文件,這就用到了ndk-jni技術!
須要安裝 eclpse cdt(開發c++) ndk plugins
下面一步一步來講明下,如何實現讀取assets目錄下的資源文件!
1.新建一個Android項目,而後右鍵Android Tools->Add Support,這個時候會彈出一個對話框,會生成一個.so文件,這個就是把咱們編寫的C++代碼打包進去.so中去!
2.編寫JNI.java文件,來聲明調用這個.so文件
而且實現函數聲明
public native String ReadFromAssets(AssetManager ass,String filename);
native關鍵詞告訴編譯器,這是一個C++的定義方法,須要C++進行具體的代碼實現!
還須要載入.so文件,寫法以下:
static
{
System.loadLibrary("readassetsdata");
}
3.編譯程序(這一步很重要,不然在後一步的生成頭文件會失敗)
而後CMD窗口到這個工程的bin/classes目錄下,輸入以下內容:
javah -classpath . -jni 包名.類名便可,而後會在bin/classes文件夾下會生成一個頭文件,將其放到jni目錄下
生成的頭文件以下:
JNIEXPORT jstring JNICALL Java_com_example_readassetsdata_JNI_ReadFromAssets(JNIEnv *, jobject, jobject, jstring);
4.打開自動生成的cpp文件,而後包含剛纔的.h頭文件,實現這個方法!
#include <jni.h>
#include <android\log.h>
#include <android\asset_manager.h>
#include <android\asset_manager_jni.h>
#include <stdlib.h>
#include "com_example_readassetsdata_JNI.h"
JNICALL jstring Java_com_example_readassetsdata_JNI_ReadFromAssets(JNIEnv *env, jobject obj, jobject obj1, jstring string1) {
AAssetManager* mgr = AAssetManager_fromJava(env, obj1);
if (mgr == NULL) {
return env->NewStringUTF("");
}
/*獲取文件名並打開*/
jboolean iscopy;
const char *mfile = env->GetStringUTFChars(string1, &iscopy);
AAsset* asset = AAssetManager_open(mgr, mfile, AASSET_MODE_UNKNOWN);
env->ReleaseStringUTFChars(string1, mfile);
if (asset == NULL) {
return env->NewStringUTF("");
}
/*獲取文件大小*/
off_t bufferSize = AAsset_getLength(asset);
char *buffer = (char *) malloc(bufferSize + 1);
buffer[bufferSize] = 0;
int numBytesRead = AAsset_read(asset, buffer, bufferSize);
jstring resultstring;
resultstring=env->NewStringUTF(buffer);
free(buffer);
/*關閉文件*/
AAsset_close(asset);
return resultstring;
}
5.而後就能夠ndk-build生成.so文件,在java中進行獲取就行!
view=(TextView) findViewById(R.id.textView1);
view.setText(new JNI().ReadFromAssets(getAssets(), "qlgame2dtest.txt"));
就能夠經過這樣,C++就能夠訪問Assets目錄下的文件了!