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 <androidlog.h>

           #include <androidasset_manager.h>

           #include <androidasset_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目录下的文件了!

 

                           

原文地址:https://www.cnblogs.com/alongu3d/p/4364592.html