【COCOS2DX-LUA 脚本开发之十三】解决lua项目编译Android出现get data from file failed以及路径等问题

简介:

 

对于跨平台整合,Himi已经写了1.x 与 2.x 的了,还不知道如何整合的请移步到

【Cocos2d-X(2.x) 游戏开发系列之二】cocos2dx最新2.x版本跨平台整合NDK+Xcode,Xcode编写&编译代码,Android导入打包运行即可!

本篇只是解决在整合cocos2dx-lua项目会出现的几个问题的方法。

首先需要说明的是Himi使用的Cocos2dx Version : Cocos2dx 2.1.2 hotfix

   第一:关于 get data from file(xxx.lua) failed/can not get file data of xxx.lua  这个问题,如下图:

QQ20130423-9

 

此问题的原因是由于你自定义目录的原因造成的,将到目录,那么不得不说明下,在xcode中有两种颜色的文件夹,第一种 黄色 和 绿色 

黄色文件夹:不带路径,直接添加到根目录的文件夹,也就是说没有文件夹的意思,只是将文件添加项目中了。

     绿色文件夹:真正的将文件夹添加进来,其文件夹中的每个文件带有路径。如a/a.lua,是将文件夹整个添加到项目的根目录

可能还有童鞋不是很明白上面的两种颜色的文件夹的意思,下面举个例子:

例如我们将一个ios项目进行打包,此ios项目的Resources添加一个叫dir的文件夹,其中dir中包括两个lua文件a.lua b.lua 那么此时将dir文件夹添加进项目我们xcode项目中,肯定需要右键Resources文件夹“Add Files to xxx(项目名)”,然后在新窗口中选择我们需要添加的文件夹,如下图:

QQ20130423-8

需要注意的是在下方有一个选项:

Folders :

1. Create groups for any added folders: 默认选项,将文件夹创建成一个groups形式添加

2. Create folder references for any added folders : 引用创建文件夹进行添加

 使用第一种形式进行添加的文件夹是黄色,第二种形式添加的文件夹是绿色

那么如果我们采用第一种形式将dir文件夹加入项目进行打包,那么解压xx.ipa后可以发现这个dir文件夹不存在的,并且dir文件夹中的文件全部都默认放在项目根目录中。

反之 ,如果我们采用第二种形式添加,那么打包后的项目.ipa解压后会看到dir文件。

不知道这么说大家有没有理解,还不理解的童鞋请自行打包测试观察!

需要注意的是!使用ndk 编译cocos2dx-lua项目时,默认把项目下的Resources  所有文件夹和文件都copy到android项目的assets目录下!

下面开始讲解为什么出现 get data from file(xxx.lua) failed/can not get file data of xxx.lua  

其实这个问题是android加载运行lua文件时找不到这个文件,说白了就是路径不对!

举例,如果你有一个添加了一个lua文件夹,其中包含一个黄色的himi.lua脚本文件夹,当你执行时,代码一般如下:

 


  
  
  1. #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) 
  2.     CCString* pstrFileContent = CCString::createWithContentsOfFile("himi.lua"); 
  3.  
  4. if (pstrFileContent) 
  5.  { 
  6.  pEngine->executeString(pstrFileContent->getCString()); 
  7.  } 
  8. #else 
  9.  std::string path = CCFileUtils::sharedFileUtils()->fullPathForFilename("himi.lua"); 
  10.  pEngine->addSearchPath(path.substr(0, path.find_last_of("/")).c_str()); 
  11.  pEngine->executeScriptFile(path.c_str()); 
  12. #endif <em id="__mceDel"
  13. </em> 
 

童鞋们想一想,如上代码中如果是ios平台获取himi.lua完整路径是不是就是根目录下,因为这个脚本上一层lua文件夹是个黄色文件夹!那么在ios上执行运行肯定没有任何问题。

    但是!如果你将此段代码直接编译android运行肯定出现找不到himi.lua文件的问题,原因是你应该加上路径,修改如上一段代码如下:

 


  
  
  1. #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) 
  2.     CCString* pstrFileContent = CCString::createWithContentsOfFile("lua/himi.lua"); 
  3.  if (pstrFileContent) 
  4.  { 
  5.  pEngine->executeString(pstrFileContent->getCString()); 
  6.  } 
  7. #else 
  8.  std::string path = CCFileUtils::sharedFileUtils()->fullPathForFilename("himi.lua"); 
  9.  pEngine->addSearchPath(path.substr(0, path.find_last_of("/")).c_str()); 
  10.  pEngine->executeScriptFile(path.c_str()); 
  11. #endif 
 

   如上添加路径后即可运行成功!但是!新问题又出现了,一旦你在编译代码到Android后,如果有自定义的文件夹,那么其中的每个文件都需要路径,这是个问题,另外如果你的一个脚本中有require 其他脚本,也会有问题!对不对?!

         因此我们可以采取如下来完美解决:

           一、 我们添加自定义脚本文件夹,可以绿色文件夹方式添加。

          二、当require 其他脚本时,书写完整的路径,如:require “x.lua”

这样我们就可以让ios运行脚本也需要路径,这样统一了android与ios加载资源的路径问题!

运行第一个lua,示例代码可以如下:

 


  
  
  1. std::string dirPath = "lua"
  2. #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) 
  3.     CCString* pstrFileContent = CCString::createWithContentsOfFile((dirPath + "/x.lua").c_str()); 
  4.     if (pstrFileContent) 
  5.     { 
  6.         pEngine->executeString(pstrFileContent->getCString()); 
  7.     } 
  8. #else 
  9.     std::string path = CCFileUtils::sharedFileUtils()->fullPathForFilename((dirPath + "/x.lua").c_str()); 
  10.     pEngine->addSearchPath(path.substr(0, path.find_last_of("/") - dirPath.length()).c_str()); 
  11.     pEngine->executeScriptFile(path.c_str()); 
  12. #endif  
  13. //    CCDirector::sharedDirector()->runWithScene(World::scene()); 
  14.   
  15.     return true
 

 

 

 第二:在终端里使用ndk编译时出现fata error HelloWorldScene.h No such file问题 如下图:

QQ20130422-1

此问题是因为lua模板是没有此类的,所以我们修改如下文件:

找到你整合的android项目目录下的jni/hellocpp/main.cpp文件,将

#include “HelloWorldScene.h”  修改为: #include “cocos2d.h”

 

ok,再编译即可。

 

第三:类第一个问题,编译时出现 CCLuaEngine.h: No such file 问题,如下图:

QQ20130423-3

 

此问题需要修改你整合android项目下的jni/Android.mk 文件,如下:

首先删除      ../../Classes/HelloWorldScene.cpp

然后在  LOCAL_WHOLE_STATIC_LIBRARIES 后添加 cocos_lua_static 库

最后添加 $(call import-module,scripting/lua/proj.android/jni)

大家可以参考引擎示例中的lua示例下的  jni/Android.mk  配置即可。其中还添加物理引擎box2d等库等

 

    第四:Eclipse导入Android项目报错 Cocos2dxActivity cannot be resolved to a type 或 The Improt org.cocos2dx.lib cannot be resolved 问题,如下图:

 

QQ20130423-4

这种问题是Build Path缺少文件的link,我们配置下即可,首先右键项目然后选择Properties,然后选择“Java Build Path”,在 Source 栏目中点击“Link Source” ,如下图:

 

QQ20130423-5

 

 

然后会出现一个新窗口:

Linked folder location:

选择link的文件,其路径指向cocos2dx引擎目录的cocos2d-2.1rc0-x-2.1.2-hotfix/cocos2dx/platform/android/java/src 目录即可!

 Folder name :

这里默认是src,如果报错,我们自定义个名字即可。

设置完成后一路finish或OK保存返回。

 

 

QQ20130423-6









本文转自 xiaominghimi 51CTO博客,原文链接:http://blog.51cto.com/xiaominghimi/1184710,如需转载请自行联系原作者
目录
相关文章
|
3月前
|
Java Android开发 C++
Android Studio JNI 使用模板:c/cpp源文件的集成编译,快速上手
本文提供了一个Android Studio中JNI使用的模板,包括创建C/C++源文件、编辑CMakeLists.txt、编写JNI接口代码、配置build.gradle以及编译生成.so库的详细步骤,以帮助开发者快速上手Android平台的JNI开发和编译过程。
234 1
|
29天前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
81 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
1月前
|
编译器 Android开发
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
|
1月前
|
Ubuntu Shell API
Ubuntu 64系统编译android arm64-v8a 的openssl静态库libssl.a和libcrypto.a
Ubuntu 64系统编译android arm64-v8a 的openssl静态库libssl.a和libcrypto.a
|
1月前
BUG!!!======> 编译安装lua 时 lua.c:67:31: fatal error: readline/readline.h: No such file or directory
BUG!!!======> 编译安装lua 时 lua.c:67:31: fatal error: readline/readline.h: No such file or directory
35 1
|
3月前
|
Android开发 Docker 容器
docker中编译android aosp源码,出现Build sandboxing disabled due to nsjail error
在使用Docker编译Android AOSP源码时,如果遇到"Build sandboxing disabled due to nsjail error"的错误,可以通过在docker run命令中添加`--privileged`参数来解决权限不足的问题。
605 1
|
3月前
|
Android开发
Android Studio: 解决Gradle sync failed 错误
本文介绍了解决Android Studio中出现的Gradle同步失败错误的步骤,包括从`gradle-wrapper.properties`文件中获取Gradle的下载链接,手动下载Gradle压缩包,并替换默认下载路径中的临时文件,然后重新触发Android Studio的"Try Again"来完成同步。
1305 0
Android Studio: 解决Gradle sync failed 错误
|
3月前
|
Java Android开发 芯片
使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题
本文介绍了如何将基于全志H713芯片的AOSP Android源码导入Android Studio以解决编译和编码问题,通过操作步骤的详细说明,展示了在Android Studio中利用代码提示和补全功能快速定位并修复编译错误的方法。
128 0
使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题
|
3月前
|
API 开发工具 Android开发
Android Studio:解决AOSP自编译framework.jar引用不到的问题
在Android Studio中解决AOSP自编译framework.jar引用问题的几种方法,包括使用相对路径、绝对路径和通过`${project.rootDir}`动态获取路径的方法,以避免硬编码路径带来的配置问题。
216 0
Android Studio:解决AOSP自编译framework.jar引用不到的问题
|
3月前
|
搜索推荐 Android开发
学习AOSP安卓系统源代码,需要什么样的电脑?不同配置的电脑,其编译时间有多大差距?
本文分享了不同价位电脑配置对于编译AOSP安卓系统源代码的影响,提供了从6000元到更高价位的电脑配置实例,并比较了它们的编译时间,以供学习AOSP源代码时电脑配置选择的参考。
234 0
学习AOSP安卓系统源代码,需要什么样的电脑?不同配置的电脑,其编译时间有多大差距?