2.4.6 spine 从JSON 改二进制后 安卓原生报错

spine 资源从 json 改为二进制后,安卓壳项目和web都没有问题,但是打安卓原生包运行时报错:
定位到 jsb_spine_manual.cpp 文件中的 131行,解析二进制动画数据失败。

运行时报错信息:
D:/erciyuan/clientCS/GameWord/build/jsb-default/frameworks/cocos2d-x/cocos/editor-support/…/scripting/js-bindings/manual/jsb_spine_manual.cpp function:js_register_spine_initSkeletonData line:131

我检查过skel 文件
美术都按照规定导出的3.8+ 版本,具体版本是:3.8.75

注意:我同时测试了把项目退回到2.4.3版本,也一样。

我们好几个项目都有这问题,目前没看到有什么解决方法,只能把报错的skel换回json

看代码报错,只是个解析的报错,应该很好修。
https://gitee.com/mirrors_cocos-creator/engine-native/blob/v2.4.6/cocos/scripting/js-bindings/manual/jsb_spine_manual.cpp#L106

SkeletonData *SkeletonBinary::readSkeletonData(const unsigned char *binary, const int length) {
bool nonessential;
SkeletonData *skeletonData;

DataInput *input = new(__FILE__, __LINE__) DataInput();
input->cursor = binary;
input->end = binary + length;

_linkedMeshes.clear();

skeletonData = new(__FILE__, __LINE__) SkeletonData();

char *skeletonData_hash = readString(input);
skeletonData->_hash.own(skeletonData_hash);

char *skeletonData_version = readString(input);
skeletonData->_version.own(skeletonData_version);
if ("3.8.75" == skeletonData->_version) {
    delete input;
    delete skeletonData;
    setError("Unsupported skeleton data, please export with a newer version of Spine.", "");
    return NULL;
}

。。。。。。原来3.8.75不让用。。

我们用的3.8.99,还是有部分二进制spine在原生报错

mark,

写了个工具,强行把skel 中的版本号 从3.8.75改成3.8.99,打包原生APK 一切正常,我想问问官方,为啥屏蔽3.8.75,关键是直接在代码层频闭,而文档上写的3.8+就行!这不是坑???

这个是spine运行时代码,应该和引擎组没啥关系,之前我也遇到到过同样的问题。估计3.8.75这个版本存在比较严重的问题,然后写spine运行时的那帮人就搞出了这个强制代码,哈哈。

嗯,关键的不是谁写的这个代码,而是,需要明确告诉使用者在安卓原生上有这个坑。。。官方文档上写的3.8+,所以。。。。

用nodejs 写了个小工具,来强行把.skel的版本从3.8.75改成3.8.99,注意,这是个临时方案,最好还是要求美术重新导出!但是资源量太大,暂时先这么用着吧,工具代码如下:
modifyVersion(file:string):void{

if(!fs.existsSync(file)){

  return;

}

let buffer:Buffer=fs.readFileSync(file);

let skeleton_hash: { index: number, value: string } = this.readString(buffer, 0);

// this.log(skeleton_hash.value, skeleton_hash.index);

//改写版本号

this.writeVertion(buffer,skeleton_hash.index);

//将文件重新写入

fs.writeFileSync(file,buffer);

}

readString(buffer: Buffer, index: number): { index: number, value: string } {

let result: { index: number, value: number } = this.readVarint(buffer, index, true);

index = result.index;

let len: number = result.value;

if (len == 0) {

  return { index: index, value: "" };

}

let start:number=index;

let end:number=index+len-1;

let str: string = buffer.toString("utf8", start, end);

return { index: end, value: str };

}

//写入版本号

writeVertion(buffer:Buffer,index:number){

let result: { index: number, value: number } = this.readVarint(buffer, index, true);

index = result.index;

let len: number = result.value;

if (len == 0) {

  return { index: index, value: "" };

}

let start:number=index;

let end:number=index+len-1;

let version: string = buffer.toString("utf8", start, end);

if(version=="3.8.75"){

  buffer.write("3.8.99",start);

}else{

  this.warn("不是目标版本:"+version);

}

}

readVarint(buffer: Buffer, index: number, optimizePositive: boolean = false): { index: number, value: number } {

let b = buffer[index];

index++;

let value = b & 0x7F;

if (b & 0x80) {

  b = buffer[index];

  index++;

  value |= (b & 0x7F) << 7;

  if (b & 0x80) {

    b = buffer[index];

    index++;

    value |= (b & 0x7F) << 14;

    if (b & 0x80) {

      b = buffer[index];

      index++;

      value |= (b & 0x7F) << 21;

      if (b & 0x80) {

        value |= (buffer[index] & 0x7F) << 28;

        index++;

      }

    }

  }

}

if (!optimizePositive) value = ((value >> 1) ^ -(value & 1));

return { index: index, value: value };

}

2赞

该主题在最后一个回复创建后14天后自动关闭。不再允许新的回复。