質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.84%

  • Java

    12490questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android Studio

    3278questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

  • COCOS2D-X

    168questions

    COCOS2D-Xは、 2Dゲームを手軽に開発できるフレームワークのことです。 iPhone(iOS)向け、Android等に対応しており、 実質ワンソースで開発が可能です。

AndroidStudioでCocos2dxSound.javaのエラーメッセージ

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 397

5_m_8_r_9

score 1

前提・実現したいこと

AndroidStudioでCocos2dx(cpp)のアプリをデバッグしていると以下のようなエラーメッセージが。音関連(実際音はなってない)なのとjava関連のファイル?が開けてないのはわかりましたが、具体的にどこを修正すればいいのかわかりません...

発生している問題・エラーメッセージ

console欄エラーメッセージ

E/Cocos2dxSound: error: 
                 java.io.FileNotFoundException: 
                     at android.content.res.AssetManager.openAssetFd(Native Method)
                     at android.content.res.AssetManager.openFd(AssetManager.java:339)
                     at org.cocos2dx.lib.Cocos2dxSound.createSoundIDFromAsset(Cocos2dxSound.java:282)
                     at org.cocos2dx.lib.Cocos2dxSound.preloadEffect(Cocos2dxSound.java:108)
                     at org.cocos2dx.lib.Cocos2dxSound.playEffect(Cocos2dxSound.java:149)
                     at org.cocos2dx.lib.Cocos2dxHelper.playEffect(Cocos2dxHelper.java:268)
                     at org.cocos2dx.lib.Cocos2dxRenderer.nativeRender(Native Method)
                     at org.cocos2dx.lib.Cocos2dxRenderer.onDrawFrame(Cocos2dxRenderer.java:104)
                     at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1523)
                     at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)

MainScene.cpp

#include "MainScene.h"
#include "SimpleAudioEngine.h"

USING_NS_CC;

MainScene::MainScene() {
}

MainScene::~MainScene() {
}

Scene* MainScene::createScene() {
    auto scene = Scene::create();
    auto layer = MainScene::create();
    scene->addChild(layer);
    return scene;
}

bool MainScene::init() {
    if ( !Layer::init() ) {
        return false;
    }
    CocosDenshion::SimpleAudioEngine::getInstance()->preloadBackgroundMusic("main.mp3");

    return true;
}

void MainScene::onEnter() {
    Layer::onEnter();
}

void MainScene::onEnterTransitionDidFinish() {
    Layer::onEnterTransitionDidFinish();

    CocosDenshion::SimpleAudioEngine::getInstance()->playBackgroundMusic("main.mp3", true);
}

Cocos2dxSound.java エラー付近(108,149,282)

//(略)

 public int preloadEffect(final String path) {
        if (CocosPlayClient.isEnabled() && !CocosPlayClient.isDemo()) {
            CocosPlayClient.updateAssets(path);
        }
        CocosPlayClient.notifyFileLoaded(path);
        Integer soundID = this.mPathSoundIDMap.get(path);

        if (soundID == null) {
            soundID = this.createSoundIDFromAsset(path);
            // save value just in case if file is really loaded
            if (soundID != Cocos2dxSound.INVALID_SOUND_ID) {
                this.mPathSoundIDMap.put(path, soundID);
            }
        }

        return soundID;
    }

//(略)

 public int playEffect(final String path, final boolean loop, float pitch, float pan, float gain){
        Integer soundID = this.mPathSoundIDMap.get(path);
        int streamID = Cocos2dxSound.INVALID_STREAM_ID;

        if (soundID != null) {
            // parameters; pan = -1 for left channel, 1 for right channel, 0 for both channels

            // play sound
            streamID = this.doPlayEffect(path, soundID, loop, pitch, pan, gain);
        } else {
            // the effect is not prepared
            soundID = this.preloadEffect(path);
            if (soundID == Cocos2dxSound.INVALID_SOUND_ID) {
                // can not preload effect
                return Cocos2dxSound.INVALID_SOUND_ID;
            }

            SoundInfoForLoadedCompleted info = new SoundInfoForLoadedCompleted(path, loop, pitch, pan, gain);
            mPlayWhenLoadedEffects.putIfAbsent(soundID, info);

            synchronized(info) {
                try {
                    info.wait(LOAD_TIME_OUT);
                }
                catch (Exception e) {
                    e.printStackTrace();
                }
            }
            streamID = info.effectID;
            mPlayWhenLoadedEffects.remove(soundID);
        }

        return streamID;
    }

//(略)

 public int createSoundIDFromAsset(final String path) {
        int soundID = Cocos2dxSound.INVALID_SOUND_ID;

        try {
            if (path.startsWith("/")) {
                soundID = this.mSoundPool.load(path, 0);
            } else {
                soundID = this.mSoundPool.load(this.mContext.getAssets().openFd(path), 0);
            }
        } catch (final Exception e) {
            soundID = Cocos2dxSound.INVALID_SOUND_ID;
            Log.e(Cocos2dxSound.TAG, "error: " + e.getMessage(), e);
        }

        // mSoundPool.load returns 0 if something goes wrong, for example a file does not exist
        if (soundID == 0) {
            soundID = Cocos2dxSound.INVALID_SOUND_ID;
        }

        return soundID;
    }

Cocos2dxHelper.java:268付近

public static int playEffect(final String path, final boolean isLoop, final float pitch, final float pan, final float gain) {
        return Cocos2dxHelper.sCocos2dSound.playEffect(path, isLoop, pitch, pan, gain);
    }

Cocos2dxRenderer.java:104付近

 public void onDrawFrame(final GL10 gl) {
        /*
         * No need to use algorithm in default(60 FPS) situation,
         * since onDrawFrame() was called by system 60 times per second by default.
         */
        if (sAnimationInterval <= 1.0 / 60 * Cocos2dxRenderer.NANOSECONDSPERSECOND) {
            Cocos2dxRenderer.nativeRender();
        } else {
            final long now = System.nanoTime();
            final long interval = now - this.mLastTickInNanoSeconds;

            if (interval < Cocos2dxRenderer.sAnimationInterval) {
                try {
                    Thread.sleep((Cocos2dxRenderer.sAnimationInterval - interval) / Cocos2dxRenderer.NANOSECONDSPERMICROSECOND);
                } catch (final Exception e) {
                }
            }
            /*
             * Render time MUST be counted in, or the FPS will slower than appointed.
            */
            this.mLastTickInNanoSeconds = System.nanoTime();
            Cocos2dxRenderer.nativeRender();
        }
    }

補足情報

cocos2d-x-3.9
AndroidStudio2.2.3

(追記)再生しようとしているファイルはmp3です。Resources/bgm/main.mp3
(追記)元のMainScene.cpp(BGM鳴らしたいだけのコードですが)とエラーの発生しているCocosなんちゃら.javaの該当部分を追記させていただきました。AssetManager.java、GLSurfaceView.javaはconsole欄で灰色表示になってたので弄らないでということでしょうか、、、不足がありましたらまた書き込ませていただきますのでよろしくお願いします。。。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mingos

    2017/04/18 17:35

    java.io.FileNotFoundExceptionなので、再生しようとしているmp3ファイルのパスが正しくない可能性があるとしか言えないです。エラーが発生しているcocos2d-x側のコードも掲載してもらえますか?

    キャンセル

  • 5_m_8_r_9

    2017/04/18 18:55

    メインソースとエラー該当箇所の.javaのソース?を追記させていただきました。まだ不足してましたらさらに追記させていただきますのでよろしくお願いします...

    キャンセル

回答 1

checkベストアンサー

+1

載せてもらったコードでは、"main.mp3"を再生しようとしていますよね。

CocosDenshion::SimpleAudioEngine::getInstance()->preloadBackgroundMusic("main.mp3");

しかし、実際に再生したいファイルの場所は、Resources/bgm/main.mp3にあるとの事ですが、その場合はこのように書く必要があると思います。

 CocosDenshion::SimpleAudioEngine::getInstance()->playBackgroundMusic("bgm/main.mp3", true);

このパターンでは、単純にパスの指定の誤りという事になると思います。
しかし、AppDelegate.cppで、FileUtils::getInstance()->addSearchPath("bgm");を実行しているのであれば、別の原因がありそうです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/18 19:41

    そこが原因でしたか...!意外と身近なところにミスがあってショックです(てっきり.javaの部分にエラーがあるのかと思ってしまってました...)書き換えてみたところ音が鳴るようになりました。次からはFileUtils::getInstance()->addSearchPath("○○");系を先に追加しておこうと思います。ありがとうございました!!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.84%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    Androidで音楽ファイルの情報を取得したい。

    簡易的なミュージックプレイヤーを作っています。 Android(4.4.2)端末で音楽ファイルのタイトルやアートワークの情報を取得したいと思います。 ファイル名から情報

  • 解決済

    JFrameでのJPanelの切り替えについて

    前提・実現したいこと (例)Java(UIはJFrame)でゲームを作っているのですが、JPanelの切り替えをJFrameで行おうとしています。 しかし、JPanelの切り替

  • 解決済

    Java8のstreamで、自作オブジェクトのListの並べ替えをしたい

    前提・実現したいこと Java8のStreamを使用して自作オブジェクトのListの並べ替えをしたいと考えています テストとして、PersonクラスとSectionクラス、その二つ

  • 受付中

    ifより前の文に戻る方法が知りたいです

    Java初心者で、Eclipsで簡単なゲームを作っています。 選択肢で1か2をキーボードで入力してもらい、1ならバッドエンドの内容のあと直前の選択肢に戻し、2ならそのままゲーム

  • 解決済

    ワニワニパニックをjavaで作りたいのですがうまくできません。お助けください。

    前提・実現したいこと スタートボタンによりゲームを開始、ゲーム終了後にスタート画面に戻る。 ワニの出る位置を固定したい。 1分間でゲーム終了。 得点のランキング付け。 発生して

  • 解決済

    androidstudioでカメラ画像を取得できない

    前提・実現したいこと androidでカメラからの画像を取得してtess-twoで文字認識したいと思っています。 発生している問題・エラーメッセージ tess-twoの導入はう

  • 解決済

    collectionの並び替えについて

    Javaで、コレクションを、特定の順にソートしたいと思っています。 下記のソースにて、AクラスのNoフィールドに入っている数字を並び替えたいと考えています。 Noでソートした時

  • 解決済

    昇順ソートプログラム

     前提・実現したいこと 以下のプログラムを実装したいです。コードの意味も解説してほしいです。 起動時にコマンド行で指定したファイルすべてをソートするプログラム。  発生している

同じタグがついた質問を見る

  • Java

    12490questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android Studio

    3278questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

  • COCOS2D-X

    168questions

    COCOS2D-Xは、 2Dゲームを手軽に開発できるフレームワークのことです。 iPhone(iOS)向け、Android等に対応しており、 実質ワンソースで開発が可能です。