tutorial r16 r13 ndk java android c++ jni superpowered

java - r16 - ndk r13



Native Crash SIGSEGV en Android JNI (1)

Por favor, verifique que está liberando toda la memoria, está asignando Y que libera memoria / borra objetos en el orden inverso, por ejemplo, si creó el objeto A luego B, debe eliminar B y luego A.

  1. Fuga de memoria: los float* values no se liberan en Java_com_superpowered_SuperpoweredPlayer_getInfo ()
  2. Liberaría memoria asignada en analyzer-> getresults () primero, luego floatBuffer e intBuffer, luego eliminaré el analizador y luego el decodificador.

¿Estás seguro de que es correcto (y seguro) liberar la memoria asignada en analyzer-> getresults () con free (), porque la función gratuita en superpotencia puede ser diferente de la libre en tu código (si está enlazada estáticamente a la biblioteca estándar de C) ?

signal 11 (SIGSEGV), code 1 (SEGV_MAPERR) una signal 11 (SIGSEGV), code 1 (SEGV_MAPERR) Native Crash signal 11 (SIGSEGV), code 1 (SEGV_MAPERR) aleatoriamente en mi aplicación. La aplicación recorre los archivos y los analiza en el código C ++ y devuelve una matriz de flotantes. Esto se hace en una AsyncTask que se ejecuta durante un tiempo mientras se procesan los archivos. ¿Qué estoy haciendo mal en el código que está conduciendo al bloqueo? ¿O es un problema de Superpowered? Gracias.

Esta es la función AsInncTask doInBackground:

protected String doInBackground(Object... urls) { for (int i = 0; i < songFiles.size(); i++) { SongFile temp = songFiles.get(i); try { float[] f = Analyser.getInfo(temp.getPath()); if (f != null && f.length > 1) { ...save to DB } } } catch (Exception e) { } } return ""; }

La función entre el código de Java y C ++:

extern "C" JNIEXPORT jfloatArray Java_com_superpowered_SuperpoweredPlayer_getInfo(JNIEnv *env, jobject instance,jstring filepath) { jfloatArray ret; char *Path= (char *) env->GetStringUTFChars(filepath, JNI_FALSE); ret = (jfloatArray)env->NewFloatArray(2); float *values = superpoweredPlayer->getKey(Path); env->SetFloatArrayRegion(ret, 0, 2, values); env->ReleaseStringUTFChars(filepath, Path); return ret; }

La función de C ++ getKey:

float *SuperpoweredPlayer::getKey(char *url) { SuperpoweredDecoder *decoder = new SuperpoweredDecoder(); //decoder initialize from the URL input const char *openError = decoder->open(url, false, 0, 0); if (openError) { delete decoder; return NULL; }; // Create the analyzer. SuperpoweredOfflineAnalyzer *analyzer = new SuperpoweredOfflineAnalyzer(decoder->samplerate, 0, decoder->durationSeconds); // Create a buffer for the 16-bit integer samples coming from the decoder. short int *intBuffer = (short int *)malloc(decoder->samplesPerFrame * 2 * sizeof(short int) + 16384); // Create a buffer for the 32-bit floating point samples required by the effect. float *floatBuffer = (float *)malloc(decoder->samplesPerFrame * 2 * sizeof(float) + 1024); // Processing. while (true) { // Decode one frame. samplesDecoded will be overwritten with the actual decoded number of samples. unsigned int samplesDecoded = decoder->samplesPerFrame; if (decoder->decode(intBuffer, &samplesDecoded) == SUPERPOWEREDDECODER_ERROR) break; if (samplesDecoded < 1) break; // Convert the decoded PCM samples from 16-bit integer to 32-bit floating point. SuperpoweredShortIntToFloat(intBuffer, floatBuffer, samplesDecoded); // Submit samples to the analyzer. analyzer->process(floatBuffer, samplesDecoded); // Update the progress indicator. // progress = (double)decoder->samplePosition / (double)decoder->durationSamples; }; // Get the result. unsigned char *averageWaveform = NULL, *lowWaveform = NULL, *midWaveform = NULL, *highWaveform = NULL, *peakWaveform = NULL, *notes = NULL; int waveformSize, overviewSize, keyIndex; char *overviewWaveform = NULL; float loudpartsAverageDecibel, peakDecibel, bpm, averageDecibel, beatgridStartMs = 0; analyzer->getresults(&averageWaveform, &peakWaveform, &lowWaveform, &midWaveform, &highWaveform, &notes, &waveformSize, &overviewWaveform, &overviewSize, &averageDecibel, &loudpartsAverageDecibel, &peakDecibel, &bpm, &beatgridStartMs, &keyIndex); float *ret; ret=(float*)malloc(2*sizeof(float)); ret[0] = bpm; ret[1] = keyIndex; // Cleanup. delete decoder; delete analyzer; free(intBuffer); free(floatBuffer); // Done with the result, free memory. if (averageWaveform) free(averageWaveform); if (lowWaveform) free(lowWaveform); if (midWaveform) free(midWaveform); if (highWaveform) free(highWaveform); if (peakWaveform) free(peakWaveform); if (notes) free(notes); if (overviewWaveform) free(overviewWaveform); return ret; }