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

     

                               

  • 相关阅读:
    替换指定串函数
    实现超级链接
    面向对象的关系数据库设计
    SQL语句的添加、删除、修改多种方法
    InfoWorld2008最佳开源软件大奖
    判断字符是否是汉字
    delphi指针
    项目经理要“三心二意”
    Linq查询Specified cast is not valid异常的常见原因
    SQL SERVER数据库同步示例
  • 原文地址:https://www.cnblogs.com/alongu3d/p/4364593.html
Copyright © 2020-2023  润新知