3

您好,我正在尝试使用 Superpowered::AdvancedAudioPlayer 从内部存储中播放 audio.wav,但 NDK 总是通过 Open failed: ENOENT (No such file or directory) 异常。代码:

//-----------------Java------------------ -------------------------------------------------- -

 String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/MyFolder/";
        String myfile = path + "filename" + ".mp3";



if (samplerateString == null) samplerateString = "48000";
        if (buffersizeString == null) buffersizeString = "480";
         samplerate = Integer.parseInt(samplerateString);
         buffersize = Integer.parseInt(buffersizeString);

//-----------------Cpp------------------ -------------------------------------------------- ----

SoundEffects1(samplerate,     // sampling rate
                        buffersize,     // buffer size
                        myfile,        // path to .apk package
                        fileAoffset,    // offset (start) of file A in the APK
                        fileAlength,    // length of file A
                        fileBoffset,    // offset (start) of file B in the APK
                        fileBlength,     // length of file B
                        myfile,
                        myfile
            );

Extern "C"
JNIEXPORT void JNICALL
Java_com_example_superpoweredandroidtest_Dashboard_SoundEffects1(
        JNIEnv *env,
        jobject __unused ob,
        jint samplerate,
        jint buffersize,
        jstring apkPath,
        jint fileAoffset,
        jint fileAlength,
        jint fileBoffset,
        jint fileBlength,
        jstring file1Path,
        jstring file2Path
){
    const char *path = env->GetStringUTFChars(apkPath, JNI_FALSE);

    const char *file1Name = env->GetStringUTFChars(file1Path, JNI_FALSE);
    const char *file2Name = env->GetStringUTFChars(file2Path, JNI_FALSE);


    __android_log_print(ANDROID_LOG_DEBUG, APPNAME, "SoundEffects JNI Constructor %s",file1Name);
    soundEffects = new SoundEffects((unsigned int)samplerate, (unsigned int)buffersize,
                                    path, fileAoffset, fileAlength, fileBoffset, fileBlength,file1Name,file2Name);

 /*   env->ReleaseStringUTFChars(file1Path, file1Name);
    env->ReleaseStringUTFChars(file2Path, file2Name);
 */   env->ReleaseStringUTFChars(apkPath, path);
}



SoundEffects::SoundEffects (
        unsigned int samplerate, // device native sample rate
        unsigned int buffersize, // device native buffer size
        const char *path,        // path to APK package
        int fileAoffset,         // offset of file A in APK
        int fileAlength,         // length of file A
        int fileBoffset,         // offset of file B in APK
        int fileBlength,
        const char *file1Path,
        const char *file2Path
) : activeFx(0), numPlayersLoaded(0), crossFaderPosition(0.0f), volB(0.0f), volA(1.0f * headroom)
{

    initializeSDK();

    playerA = new Superpowered::AdvancedAudioPlayer(samplerate, 0);
    playerB = new Superpowered::AdvancedAudioPlayer(samplerate, 0);
    roll = new Superpowered::Roll(samplerate);
    filter = new Superpowered::Filter(Superpowered::Resonant_Lowpass, samplerate);
    flanger = new Superpowered::Flanger(samplerate);
    filter->resonance = 0.1f;


  //  stereoBuffer = (float *) memalign(16, (buffersize + 16) * sizeof(float) * 2);


  //  __android_log_print(ANDROID_LOG_DEBUG, APPNAME, "file===> %s",path);



//----------------------------------------------------------------------------------------------
    std::fopen(path, "r");

    __android_log_print(ANDROID_LOG_DEBUG, APPNAME, "SoundEffects Cpp Constructor %s",path);
      playerA->open(path);
 //   playerB->open(path);

    playerA->play();
 //-------------------working---------------------------------------------------------------------------



    //     playerA->open(path, fileAoffset, fileAlength);
//        playerB->open(path, fileBoffset, fileBlength);


    // Initialize audio engine and pass callback function.
    output = new SuperpoweredAndroidAudioIO (
            samplerate,                     // device native sample rate
            buffersize,                     // device native buffer size
            false,                          // enableInput
            true,                           // enableOutput
            audioProcessing,                // audio callback function
            this,                           // clientData
            -1,                             // inputStreamType (-1 = default)
            SL_ANDROID_STREAM_MEDIA         // outputStreamType (-1 = default)
    );

}

void SoundEffects::initializeSDK() const {
    Superpowered::Initialize(
            "ExampleLicenseKey-WillExpire-OnNextUpdate",
            false, // enableAudioAnalysis (using SuperpoweredAnalyzer, SuperpoweredLiveAnalyzer, SuperpoweredWaveform or SuperpoweredBandpassFilterbank)
            false, // enableFFTAndFrequencyDomain (using SuperpoweredFrequencyDomain, SuperpoweredFFTComplex, SuperpoweredFFTReal or SuperpoweredPolarFFT)
            false, // enableAudioTimeStretching (using SuperpoweredTimeStretching)
            true,  // enableAudioEffects (using any SuperpoweredFX class)
            true,  // enableAudioPlayerAndDecoder (using SuperpoweredAdvancedAudioPlayer or SuperpoweredDecoder)
            false, // enableCryptographics (using Superpowered::RSAPublicKey, Superpowered::RSAPrivateKey, Superpowered::hasher or Superpowered::AES)
            false  // enableNetworking (using Superpowered::httpRequest)
    );
}
4

1 回答 1

1

我已经用 C 语言编写了代码来打开和读取文本文件,如下所示,这工作正常。希望您对如何打开文件有所了解

char *myPath;
char *myText;
char *mstrings;
JNIEXPORT jstring JNICALL
Java_com_my_apppackage_utils_Utils_readFileFromCNative(JNIEnv *env,
                                                            jobject instance, jstring path) {

    myPath = (char *) (*env)->GetStringUTFChars(env, path, 0);

    mstrings = readDocument(myPath);

    jstring myString = (*env)->NewStringUTF(env, mstrings);

//    (*env)->ReleaseStringUTFChars(env, path, myPath);

    return myString;
}

这是ReadDocument.c

#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#include "ReadDocument.h"

#define MY_FILENAME_SIZE 1000

char MY_PATH[MY_FILENAME_SIZE];

FILE *fileReader;

char *readDocument(char *filename) {

    char filePath[MY_FILENAME_SIZE];
    int fileSize;
    char *contents;

    // Open file
    strcat(strcpy(filePath, MY_PATH), filename);
    if ((fileReader = fopen(filePath, "rb")) == NULL) {
        exit(EXIT_FAILURE);
    }

    // Get file size
    fseek(fileReader, 0, SEEK_END);
    fileSize = ftell(fileReader);
    rewind(fileReader);

    // Allocate string
    contents = malloc(fileSize + 1); // +1 for termination
    if (contents == NULL) {
        fclose(fileReader);
        free(fileReader);
        printf("Could not malloc contents:");
        exit(EXIT_FAILURE);
    }

    // Load dictionary
    fread(contents, fileSize, 1, fileReader);
    contents[fileSize] = 0;

    fclose(fileReader);

    return contents;
}
于 2020-12-24T12:25:05.137 回答