cocos2dx android加载obb简单方法(只要改JAVA就可以)

cocos2dx android 加载OBB的方法网上搜索了没有特别简单的方法,我在看了英文的论坛的解决方法后,自己尝试未果,经过自己修改终于搞定了。分享出来给大家。

step1://获取obb Path PS:如果嫌麻烦可以这步可以不要,直接填值
在启动的Activity里添加如下方法


public String getObbFileName() {
        PackageInfo info = null;
        try {
            info = getPackageManager().getPackageInfo(getPackageName(), 0);
            String fileName = "main." + info.versionCode + "." + getPackageName() + ".obb";
            Log.e("===fileName===", fileName);
            return fileName;
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }
        return "";
    }


    public String getVirtualObbFileFullpath(){
          String _path = getObbDir().getPath() + "/" + getObbFileName();
          Log.e("===_path===", _path);
        return _path;    
    }

onCreate里面添加如下代码:(其中为FATE_OBB_PATH为 public static String)


FATE_OBB_PATH =getVirtualObbFileFullpath() ;//这句需要放在super.onCreate上面

step2:在cocos2dxhelper.java中做如下修改
Cocos2dxHelper.sAssetManager = activity.getAssets();
Cocos2dxHelper.nativeSetContext((Context)activity, Cocos2dxHelper.sAssetManager);
在这2句中间插入如下代码


 Method addAssetPath;
            try {
                addAssetPath = Cocos2dxHelper.sAssetManager.getClass().getMethod("addAssetPath", String.class);
                addAssetPath.invoke(Cocos2dxHelper.sAssetManager, obbPath);  
            } catch (Exception  e) {
                e.printStackTrace();
            } 

最后结果为


Cocos2dxHelper.sAssetManager = activity.getAssets();
            
            Method addAssetPath;
            try {
                addAssetPath = Cocos2dxHelper.sAssetManager.getClass().getMethod("addAssetPath", String.class);
                addAssetPath.invoke(Cocos2dxHelper.sAssetManager, obbPath);  //obbPath为第一步获取的,如果你知道这里的正确值也可以直接填写不用第一步
            } catch (Exception  e) {
                e.printStackTrace();
            }  
            Cocos2dxHelper.nativeSetContext((Context)activity, Cocos2dxHelper.sAssetManager);

PS:以上修改图片没有问题,声音可能会有问题,如果声音有问题就先放到assets里面,不要放到OBB里。

---------------------声音问题补充--------------------------------
方法1:在制作OBB文件的时候(也就是zip压缩的时候)不要压缩声音和音乐文件(用命令行,但是我不知道window是上怎么弄)。
方法2:修改代码
新建一个类(FZZippedAssetsFix ,类名随意)代码如下


package org.cocos2dx.lib;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import android.content.Context;
import android.content.res.AssetFileDescriptor;
import android.os.ParcelFileDescriptor;

public class FZZippedAssetsFix {

    public static File fileFromAsset(Context context, String assetName) throws IOException {
        File outFile = new File(context.getCacheDir(), assetName );
        outFile.getParentFile().mkdirs();
        copy(context.getAssets().open(assetName), outFile);

        return outFile;
    }

    public static void copy(InputStream inputStream, File output) throws IOException {
        FileOutputStream outputStream = null;

        try {
            outputStream = new FileOutputStream(output);
            boolean read = false;
            byte] bytes = new byte;

            int read1;
            while((read1 = inputStream.read(bytes)) != -1) {
                outputStream.write(bytes, 0, read1);
            }
        } finally {
            try {
                if(inputStream != null) {
                    inputStream.close();
                }
            } finally {
                if(outputStream != null) {
                    outputStream.close();
                }

            }

        }

    }
    
    public static AssetFileDescriptor AFDfromAssets(Context ct,String path) throws IOException{
        File file=  fileFromAsset(ct, path);
        AssetFileDescriptor  sf= new AssetFileDescriptor(ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY), 0, -1);
        return sf;
    }
}


找到Cocos2dxSound.java中的这句代码

soundID = this.mSoundPool.load(this.mContext.getAssets().openFd("assets/"+path), 0);

替换为

soundID = this.mSoundPool.load(FZZippedAssetsFix.AFDfromAssets(mContext, path), 0);

找到Cocos2dxMusic.java中的这句代码

final AssetFileDescriptor assetFileDescritor = this.mContext.getAssets().openFd(path);

替换为

final AssetFileDescriptor assetFileDescritor = FZZippedAssetsFix.AFDfromAssets(mContext, path);

上述代码就OK了。
:2:

1赞

大哥 只要按照你这设置就行了吗? 我按你这来 放到obb资源下的 路径是不是还要和之前的资源一样