QLGame 2d Engine Android端環境搭建(經過jni讀取assets目錄的文件)

          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目錄下的文件了!

相關文章
相關標籤/搜索