zoukankan      html  css  js  c++  java
  • 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目录下的文件了!

     

                               

  • 相关阅读:
    【树状数组】bzoj2743 [HEOI2012]采花
    【二分答案】bzoj1639 [Usaco2007 Mar]Monthly Expense 月度开支
    【二分答案】【最短路】bzoj1614 [Usaco2007 Jan]Telephone Lines架设电话线
    【二分答案】【Heap-Dijkstra】bzoj2709 [Violet 1]迷宫花园
    【二分答案】【字符串哈希】bzoj2084 [Poi2010]Antisymmetry
    【二分答案】【最大流】bzoj1305 [CQOI2009]dance跳舞
    【计算几何】【二分答案】【最大流】bzoj1822 [JSOI2010]Frozen Nova 冷冻波
    【二分答案】【最大流】bzoj3130 [Sdoi2013]费用流
    【动态规划】bzoj3992 [Sdoi2015]序列统计 10分
    【二分答案】【最大流】bzoj3993 [Sdoi2015]星际战争
  • 原文地址:https://www.cnblogs.com/alongu3d/p/4364593.html
Copyright © 2011-2022 走看看