diff options
author | Eric Laurent <elaurent@google.com> | 2015-06-09 17:19:08 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2015-06-09 17:19:10 +0000 |
commit | ba497f0c1664db074ea0ea4dc125dc4b0297815f (patch) | |
tree | aa22fc74a3f6a7f84c00b13b543178b47288a789 | |
parent | 0f925d0def01d586108c6ef0683efd8d9bbe1737 (diff) | |
parent | 76f81331886c0972e5f7432e4edd8c36ef1048e6 (diff) | |
download | frameworks_base-ba497f0c1664db074ea0ea4dc125dc4b0297815f.zip frameworks_base-ba497f0c1664db074ea0ea4dc125dc4b0297815f.tar.gz frameworks_base-ba497f0c1664db074ea0ea4dc125dc4b0297815f.tar.bz2 |
Merge "Use only strong references to AudioEffect" into mnc-dev
-rw-r--r-- | media/jni/audioeffect/android_media_AudioEffect.cpp | 115 | ||||
-rw-r--r-- | media/jni/audioeffect/android_media_Visualizer.cpp | 148 |
2 files changed, 139 insertions, 124 deletions
diff --git a/media/jni/audioeffect/android_media_AudioEffect.cpp b/media/jni/audioeffect/android_media_AudioEffect.cpp index 96b72a2..fdc586b 100644 --- a/media/jni/audioeffect/android_media_AudioEffect.cpp +++ b/media/jni/audioeffect/android_media_AudioEffect.cpp @@ -92,6 +92,7 @@ static jint translateError(int code) { } } +static Mutex sLock; // ---------------------------------------------------------------------------- static void effectCallback(int event, void* user, void *info) { @@ -182,6 +183,32 @@ effectCallback_Exit: } // ---------------------------------------------------------------------------- + +static sp<AudioEffect> getAudioEffect(JNIEnv* env, jobject thiz) +{ + Mutex::Autolock l(sLock); + AudioEffect* const ae = + (AudioEffect*)env->GetLongField(thiz, fields.fidNativeAudioEffect); + return sp<AudioEffect>(ae); +} + +static sp<AudioEffect> setAudioEffect(JNIEnv* env, jobject thiz, + const sp<AudioEffect>& ae) +{ + Mutex::Autolock l(sLock); + sp<AudioEffect> old = + (AudioEffect*)env->GetLongField(thiz, fields.fidNativeAudioEffect); + if (ae.get()) { + ae->incStrong((void*)setAudioEffect); + } + if (old != 0) { + old->decStrong((void*)setAudioEffect); + } + env->SetLongField(thiz, fields.fidNativeAudioEffect, (jlong)ae.get()); + return old; +} + +// ---------------------------------------------------------------------------- // This function gets some field IDs, which in turn causes class initialization. // It is called from a static block in AudioEffect, which won't run until the // first time an instance of this class is used. @@ -257,7 +284,7 @@ android_media_AudioEffect_native_setup(JNIEnv *env, jobject thiz, jobject weak_t ALOGV("android_media_AudioEffect_native_setup"); AudioEffectJniStorage* lpJniStorage = NULL; int lStatus = AUDIOEFFECT_ERROR_NO_MEMORY; - AudioEffect* lpAudioEffect = NULL; + sp<AudioEffect> lpAudioEffect; jint* nId = NULL; const char *typeStr = NULL; const char *uuidStr = NULL; @@ -272,6 +299,8 @@ android_media_AudioEffect_native_setup(JNIEnv *env, jobject thiz, jobject weak_t ScopedUtfChars opPackageNameStr(env, opPackageName); + setAudioEffect(env, thiz, 0); + if (type != NULL) { typeStr = env->GetStringUTFChars(type, NULL); if (typeStr == NULL) { // Out of memory @@ -324,7 +353,7 @@ android_media_AudioEffect_native_setup(JNIEnv *env, jobject thiz, jobject weak_t &lpJniStorage->mCallbackData, sessionId, 0); - if (lpAudioEffect == NULL) { + if (lpAudioEffect == 0) { ALOGE("Error creating AudioEffect"); goto setup_failure; } @@ -394,7 +423,7 @@ android_media_AudioEffect_native_setup(JNIEnv *env, jobject thiz, jobject weak_t env->SetObjectArrayElement(javadesc, 0, jdesc); - env->SetLongField(thiz, fields.fidNativeAudioEffect, (jlong)lpAudioEffect); + setAudioEffect(env, thiz, lpAudioEffect); env->SetLongField(thiz, fields.fidJniData, (jlong)lpJniStorage); @@ -407,12 +436,9 @@ setup_failure: env->ReleasePrimitiveArrayCritical(jId, nId, 0); } - if (lpAudioEffect) { - delete lpAudioEffect; - } - env->SetLongField(thiz, fields.fidNativeAudioEffect, 0); - if (lpJniStorage) { + env->DeleteGlobalRef(lpJniStorage->mCallbackData.audioEffect_class); + env->DeleteGlobalRef(lpJniStorage->mCallbackData.audioEffect_ref); delete lpJniStorage; } env->SetLongField(thiz, fields.fidJniData, 0); @@ -430,20 +456,20 @@ setup_failure: // ---------------------------------------------------------------------------- -static void android_media_AudioEffect_native_finalize(JNIEnv *env, jobject thiz) { - ALOGV("android_media_AudioEffect_native_finalize jobject: %p\n", thiz); - - // delete the AudioEffect object - AudioEffect* lpAudioEffect = (AudioEffect *)env->GetLongField( - thiz, fields.fidNativeAudioEffect); - if (lpAudioEffect) { - ALOGV("deleting AudioEffect: %p\n", lpAudioEffect); - delete lpAudioEffect; +static void android_media_AudioEffect_native_release(JNIEnv *env, jobject thiz) { + sp<AudioEffect> lpAudioEffect = setAudioEffect(env, thiz, 0); + if (lpAudioEffect == 0) { + return; } // delete the JNI data - AudioEffectJniStorage* lpJniStorage = (AudioEffectJniStorage *)env->GetLongField( - thiz, fields.fidJniData); + AudioEffectJniStorage* lpJniStorage = + (AudioEffectJniStorage *)env->GetLongField(thiz, fields.fidJniData); + + // reset the native resources in the Java object so any attempt to access + // them after a call to release fails. + env->SetLongField(thiz, fields.fidJniData, 0); + if (lpJniStorage) { ALOGV("deleting pJniStorage: %p\n", lpJniStorage); delete lpJniStorage; @@ -451,24 +477,16 @@ static void android_media_AudioEffect_native_finalize(JNIEnv *env, jobject thiz } // ---------------------------------------------------------------------------- -static void android_media_AudioEffect_native_release(JNIEnv *env, jobject thiz) { - - // do everything a call to finalize would - android_media_AudioEffect_native_finalize(env, thiz); - // + reset the native resources in the Java object so any attempt to access - // them after a call to release fails. - env->SetLongField(thiz, fields.fidNativeAudioEffect, 0); - env->SetLongField(thiz, fields.fidJniData, 0); +static void android_media_AudioEffect_native_finalize(JNIEnv *env, jobject thiz) { + ALOGV("android_media_AudioEffect_native_finalize jobject: %p\n", thiz); + android_media_AudioEffect_native_release(env, thiz); } static jint android_media_AudioEffect_native_setEnabled(JNIEnv *env, jobject thiz, jboolean enabled) { - // retrieve the AudioEffect object - AudioEffect* lpAudioEffect = (AudioEffect *)env->GetLongField( - thiz, fields.fidNativeAudioEffect); - - if (lpAudioEffect == NULL) { + sp<AudioEffect> lpAudioEffect = getAudioEffect(env, thiz); + if (lpAudioEffect == 0) { jniThrowException(env, "java/lang/IllegalStateException", "Unable to retrieve AudioEffect pointer for enable()"); return AUDIOEFFECT_ERROR_NO_INIT; @@ -480,11 +498,8 @@ android_media_AudioEffect_native_setEnabled(JNIEnv *env, jobject thiz, jboolean static jboolean android_media_AudioEffect_native_getEnabled(JNIEnv *env, jobject thiz) { - // retrieve the AudioEffect object - AudioEffect* lpAudioEffect = (AudioEffect *)env->GetLongField( - thiz, fields.fidNativeAudioEffect); - - if (lpAudioEffect == NULL) { + sp<AudioEffect> lpAudioEffect = getAudioEffect(env, thiz); + if (lpAudioEffect == 0) { jniThrowException(env, "java/lang/IllegalStateException", "Unable to retrieve AudioEffect pointer for getEnabled()"); return JNI_FALSE; @@ -501,11 +516,8 @@ android_media_AudioEffect_native_getEnabled(JNIEnv *env, jobject thiz) static jboolean android_media_AudioEffect_native_hasControl(JNIEnv *env, jobject thiz) { - // retrieve the AudioEffect object - AudioEffect* lpAudioEffect = (AudioEffect *)env->GetLongField( - thiz, fields.fidNativeAudioEffect); - - if (lpAudioEffect == NULL) { + sp<AudioEffect> lpAudioEffect = getAudioEffect(env, thiz); + if (lpAudioEffect == 0) { jniThrowException(env, "java/lang/IllegalStateException", "Unable to retrieve AudioEffect pointer for hasControl()"); return JNI_FALSE; @@ -528,10 +540,8 @@ static jint android_media_AudioEffect_native_setParameter(JNIEnv *env, effect_param_t *p; int voffset; - AudioEffect* lpAudioEffect = (AudioEffect *) env->GetLongField(thiz, - fields.fidNativeAudioEffect); - - if (lpAudioEffect == NULL) { + sp<AudioEffect> lpAudioEffect = getAudioEffect(env, thiz); + if (lpAudioEffect == 0) { jniThrowException(env, "java/lang/IllegalStateException", "Unable to retrieve AudioEffect pointer for setParameter()"); return AUDIOEFFECT_ERROR_NO_INIT; @@ -591,10 +601,8 @@ android_media_AudioEffect_native_getParameter(JNIEnv *env, effect_param_t *p; int voffset; - AudioEffect* lpAudioEffect = (AudioEffect *) env->GetLongField(thiz, - fields.fidNativeAudioEffect); - - if (lpAudioEffect == NULL) { + sp<AudioEffect> lpAudioEffect = getAudioEffect(env, thiz); + if (lpAudioEffect == 0) { jniThrowException(env, "java/lang/IllegalStateException", "Unable to retrieve AudioEffect pointer for getParameter()"); return AUDIOEFFECT_ERROR_NO_INIT; @@ -657,11 +665,8 @@ static jint android_media_AudioEffect_native_command(JNIEnv *env, jobject thiz, jbyte* pReplyData = NULL; jint lStatus = AUDIOEFFECT_ERROR_BAD_VALUE; - // retrieve the AudioEffect object - AudioEffect* lpAudioEffect = (AudioEffect *) env->GetLongField(thiz, - fields.fidNativeAudioEffect); - - if (lpAudioEffect == NULL) { + sp<AudioEffect> lpAudioEffect = getAudioEffect(env, thiz); + if (lpAudioEffect == 0) { jniThrowException(env, "java/lang/IllegalStateException", "Unable to retrieve AudioEffect pointer for setParameter()"); return AUDIOEFFECT_ERROR_NO_INIT; diff --git a/media/jni/audioeffect/android_media_Visualizer.cpp b/media/jni/audioeffect/android_media_Visualizer.cpp index abc681e..6098b4a 100644 --- a/media/jni/audioeffect/android_media_Visualizer.cpp +++ b/media/jni/audioeffect/android_media_Visualizer.cpp @@ -102,14 +102,14 @@ struct visualizer_callback_cookie { }; // ---------------------------------------------------------------------------- -class visualizerJniStorage { +class VisualizerJniStorage { public: visualizer_callback_cookie mCallbackData; - visualizerJniStorage() { + VisualizerJniStorage() { } - ~visualizerJniStorage() { + ~VisualizerJniStorage() { } }; @@ -135,6 +135,7 @@ static jint translateError(int code) { } } +static Mutex sLock; // ---------------------------------------------------------------------------- static void ensureArraySize(JNIEnv *env, jbyteArray *array, uint32_t size) { @@ -227,15 +228,30 @@ static void captureCallback(void* user, } } -static Visualizer *getVisualizer(JNIEnv* env, jobject thiz) +// ---------------------------------------------------------------------------- + +static sp<Visualizer> getVisualizer(JNIEnv* env, jobject thiz) { - Visualizer *v = (Visualizer *)env->GetLongField( - thiz, fields.fidNativeVisualizer); - if (v == NULL) { - jniThrowException(env, "java/lang/IllegalStateException", - "Unable to retrieve Visualizer pointer"); + Mutex::Autolock l(sLock); + Visualizer* const v = + (Visualizer*)env->GetLongField(thiz, fields.fidNativeVisualizer); + return sp<Visualizer>(v); +} + +static sp<Visualizer> setVisualizer(JNIEnv* env, jobject thiz, + const sp<Visualizer>& v) +{ + Mutex::Autolock l(sLock); + sp<Visualizer> old = + (Visualizer*)env->GetLongField(thiz, fields.fidNativeVisualizer); + if (v.get()) { + v->incStrong((void*)setVisualizer); + } + if (old != 0) { + old->decStrong((void*)setVisualizer); } - return v; + env->SetLongField(thiz, fields.fidNativeVisualizer, (jlong)v.get()); + return old; } // ---------------------------------------------------------------------------- @@ -318,7 +334,7 @@ static void android_media_visualizer_effect_callback(int32_t event, void *info) { if ((event == AudioEffect::EVENT_ERROR) && (*((status_t*)info) == DEAD_OBJECT)) { - visualizerJniStorage* lpJniStorage = (visualizerJniStorage*)user; + VisualizerJniStorage* lpJniStorage = (VisualizerJniStorage*)user; visualizer_callback_cookie* callbackInfo = &lpJniStorage->mCallbackData; JNIEnv *env = AndroidRuntime::getJNIEnv(); @@ -336,14 +352,16 @@ android_media_visualizer_native_setup(JNIEnv *env, jobject thiz, jobject weak_th jint sessionId, jintArray jId, jstring opPackageName) { ALOGV("android_media_visualizer_native_setup"); - visualizerJniStorage* lpJniStorage = NULL; + VisualizerJniStorage* lpJniStorage = NULL; int lStatus = VISUALIZER_ERROR_NO_MEMORY; - Visualizer* lpVisualizer = NULL; + sp<Visualizer> lpVisualizer; jint* nId = NULL; ScopedUtfChars opPackageNameStr(env, opPackageName); - lpJniStorage = new visualizerJniStorage(); + setVisualizer(env, thiz, 0); + + lpJniStorage = new VisualizerJniStorage(); if (lpJniStorage == NULL) { ALOGE("setup: Error creating JNI Storage"); goto setup_failure; @@ -371,7 +389,7 @@ android_media_visualizer_native_setup(JNIEnv *env, jobject thiz, jobject weak_th android_media_visualizer_effect_callback, lpJniStorage, sessionId); - if (lpVisualizer == NULL) { + if (lpVisualizer == 0) { ALOGE("Error creating Visualizer"); goto setup_failure; } @@ -392,7 +410,7 @@ android_media_visualizer_native_setup(JNIEnv *env, jobject thiz, jobject weak_th env->ReleasePrimitiveArrayCritical(jId, nId, 0); nId = NULL; - env->SetLongField(thiz, fields.fidNativeVisualizer, (jlong)lpVisualizer); + setVisualizer(env, thiz, lpVisualizer); env->SetLongField(thiz, fields.fidJniData, (jlong)lpJniStorage); @@ -405,12 +423,9 @@ setup_failure: env->ReleasePrimitiveArrayCritical(jId, nId, 0); } - if (lpVisualizer) { - delete lpVisualizer; - } - env->SetLongField(thiz, fields.fidNativeVisualizer, 0); - if (lpJniStorage) { + env->DeleteGlobalRef(lpJniStorage->mCallbackData.visualizer_class); + env->DeleteGlobalRef(lpJniStorage->mCallbackData.visualizer_ref); delete lpJniStorage; } env->SetLongField(thiz, fields.fidJniData, 0); @@ -419,49 +434,44 @@ setup_failure: } // ---------------------------------------------------------------------------- -static void android_media_visualizer_native_finalize(JNIEnv *env, jobject thiz) { - ALOGV("android_media_visualizer_native_finalize jobject: %p\n", thiz); - - // delete the Visualizer object - Visualizer* lpVisualizer = (Visualizer *)env->GetLongField( - thiz, fields.fidNativeVisualizer); - if (lpVisualizer) { - ALOGV("deleting Visualizer: %p\n", lpVisualizer); - delete lpVisualizer; +static void android_media_visualizer_native_release(JNIEnv *env, jobject thiz) { + sp<Visualizer> lpVisualizer = setVisualizer(env, thiz, 0); + if (lpVisualizer == 0) { + return; } // delete the JNI data - visualizerJniStorage* lpJniStorage = (visualizerJniStorage *)env->GetLongField( - thiz, fields.fidJniData); + VisualizerJniStorage* lpJniStorage = + (VisualizerJniStorage *)env->GetLongField(thiz, fields.fidJniData); + + // reset the native resources in the Java object so any attempt to access + // them after a call to release fails. + env->SetLongField(thiz, fields.fidJniData, 0); + if (lpJniStorage) { ALOGV("deleting pJniStorage: %p\n", lpJniStorage); delete lpJniStorage; } } -// ---------------------------------------------------------------------------- -static void android_media_visualizer_native_release(JNIEnv *env, jobject thiz) { - - // do everything a call to finalize would - android_media_visualizer_native_finalize(env, thiz); - // + reset the native resources in the Java object so any attempt to access - // them after a call to release fails. - env->SetLongField(thiz, fields.fidNativeVisualizer, 0); - env->SetLongField(thiz, fields.fidJniData, 0); +static void android_media_visualizer_native_finalize(JNIEnv *env, jobject thiz) { + ALOGV("android_media_visualizer_native_finalize jobject: %p\n", thiz); + android_media_visualizer_native_release(env, thiz); } +// ---------------------------------------------------------------------------- static jint android_media_visualizer_native_setEnabled(JNIEnv *env, jobject thiz, jboolean enabled) { - Visualizer* lpVisualizer = getVisualizer(env, thiz); - if (lpVisualizer == NULL) { + sp<Visualizer> lpVisualizer = getVisualizer(env, thiz); + if (lpVisualizer == 0) { return VISUALIZER_ERROR_NO_INIT; } jint retVal = translateError(lpVisualizer->setEnabled(enabled)); if (!enabled) { - visualizerJniStorage* lpJniStorage = (visualizerJniStorage *)env->GetLongField( + VisualizerJniStorage* lpJniStorage = (VisualizerJniStorage *)env->GetLongField( thiz, fields.fidJniData); if (NULL != lpJniStorage) @@ -474,8 +484,8 @@ android_media_visualizer_native_setEnabled(JNIEnv *env, jobject thiz, jboolean e static jboolean android_media_visualizer_native_getEnabled(JNIEnv *env, jobject thiz) { - Visualizer* lpVisualizer = getVisualizer(env, thiz); - if (lpVisualizer == NULL) { + sp<Visualizer> lpVisualizer = getVisualizer(env, thiz); + if (lpVisualizer == 0) { return JNI_FALSE; } @@ -507,8 +517,8 @@ android_media_visualizer_native_getMaxCaptureRate(JNIEnv* /* env */, jobject /* static jint android_media_visualizer_native_setCaptureSize(JNIEnv *env, jobject thiz, jint size) { - Visualizer* lpVisualizer = getVisualizer(env, thiz); - if (lpVisualizer == NULL) { + sp<Visualizer> lpVisualizer = getVisualizer(env, thiz); + if (lpVisualizer == 0) { return VISUALIZER_ERROR_NO_INIT; } @@ -518,8 +528,8 @@ android_media_visualizer_native_setCaptureSize(JNIEnv *env, jobject thiz, jint s static jint android_media_visualizer_native_getCaptureSize(JNIEnv *env, jobject thiz) { - Visualizer* lpVisualizer = getVisualizer(env, thiz); - if (lpVisualizer == NULL) { + sp<Visualizer> lpVisualizer = getVisualizer(env, thiz); + if (lpVisualizer == 0) { return -1; } return (jint) lpVisualizer->getCaptureSize(); @@ -528,8 +538,8 @@ android_media_visualizer_native_getCaptureSize(JNIEnv *env, jobject thiz) static jint android_media_visualizer_native_setScalingMode(JNIEnv *env, jobject thiz, jint mode) { - Visualizer* lpVisualizer = getVisualizer(env, thiz); - if (lpVisualizer == NULL) { + sp<Visualizer> lpVisualizer = getVisualizer(env, thiz); + if (lpVisualizer == 0) { return VISUALIZER_ERROR_NO_INIT; } @@ -539,8 +549,8 @@ android_media_visualizer_native_setScalingMode(JNIEnv *env, jobject thiz, jint m static jint android_media_visualizer_native_getScalingMode(JNIEnv *env, jobject thiz) { - Visualizer* lpVisualizer = getVisualizer(env, thiz); - if (lpVisualizer == NULL) { + sp<Visualizer> lpVisualizer = getVisualizer(env, thiz); + if (lpVisualizer == 0) { return -1; } return (jint)lpVisualizer->getScalingMode(); @@ -549,8 +559,8 @@ android_media_visualizer_native_getScalingMode(JNIEnv *env, jobject thiz) static jint android_media_visualizer_native_setMeasurementMode(JNIEnv *env, jobject thiz, jint mode) { - Visualizer* lpVisualizer = getVisualizer(env, thiz); - if (lpVisualizer == NULL) { + sp<Visualizer> lpVisualizer = getVisualizer(env, thiz); + if (lpVisualizer == 0) { return VISUALIZER_ERROR_NO_INIT; } return translateError(lpVisualizer->setMeasurementMode(mode)); @@ -559,8 +569,8 @@ android_media_visualizer_native_setMeasurementMode(JNIEnv *env, jobject thiz, ji static jint android_media_visualizer_native_getMeasurementMode(JNIEnv *env, jobject thiz) { - Visualizer* lpVisualizer = getVisualizer(env, thiz); - if (lpVisualizer == NULL) { + sp<Visualizer> lpVisualizer = getVisualizer(env, thiz); + if (lpVisualizer == 0) { return MEASUREMENT_MODE_NONE; } return lpVisualizer->getMeasurementMode(); @@ -569,8 +579,8 @@ android_media_visualizer_native_getMeasurementMode(JNIEnv *env, jobject thiz) static jint android_media_visualizer_native_getSamplingRate(JNIEnv *env, jobject thiz) { - Visualizer* lpVisualizer = getVisualizer(env, thiz); - if (lpVisualizer == NULL) { + sp<Visualizer> lpVisualizer = getVisualizer(env, thiz); + if (lpVisualizer == 0) { return -1; } return (jint) lpVisualizer->getSamplingRate(); @@ -579,8 +589,8 @@ android_media_visualizer_native_getSamplingRate(JNIEnv *env, jobject thiz) static jint android_media_visualizer_native_getWaveForm(JNIEnv *env, jobject thiz, jbyteArray jWaveform) { - Visualizer* lpVisualizer = getVisualizer(env, thiz); - if (lpVisualizer == NULL) { + sp<Visualizer> lpVisualizer = getVisualizer(env, thiz); + if (lpVisualizer == 0) { return VISUALIZER_ERROR_NO_INIT; } @@ -597,8 +607,8 @@ android_media_visualizer_native_getWaveForm(JNIEnv *env, jobject thiz, jbyteArra static jint android_media_visualizer_native_getFft(JNIEnv *env, jobject thiz, jbyteArray jFft) { - Visualizer* lpVisualizer = getVisualizer(env, thiz); - if (lpVisualizer == NULL) { + sp<Visualizer> lpVisualizer = getVisualizer(env, thiz); + if (lpVisualizer == 0) { return VISUALIZER_ERROR_NO_INIT; } @@ -616,8 +626,8 @@ android_media_visualizer_native_getFft(JNIEnv *env, jobject thiz, jbyteArray jFf static jint android_media_visualizer_native_getPeakRms(JNIEnv *env, jobject thiz, jobject jPeakRmsObj) { - Visualizer* lpVisualizer = getVisualizer(env, thiz); - if (lpVisualizer == NULL) { + sp<Visualizer> lpVisualizer = getVisualizer(env, thiz); + if (lpVisualizer == 0) { return VISUALIZER_ERROR_NO_INIT; } int32_t measurements[2]; @@ -635,11 +645,11 @@ android_media_visualizer_native_getPeakRms(JNIEnv *env, jobject thiz, jobject jP static jint android_media_setPeriodicCapture(JNIEnv *env, jobject thiz, jint rate, jboolean jWaveform, jboolean jFft) { - Visualizer* lpVisualizer = getVisualizer(env, thiz); - if (lpVisualizer == NULL) { + sp<Visualizer> lpVisualizer = getVisualizer(env, thiz); + if (lpVisualizer == 0) { return VISUALIZER_ERROR_NO_INIT; } - visualizerJniStorage* lpJniStorage = (visualizerJniStorage *)env->GetLongField(thiz, + VisualizerJniStorage* lpJniStorage = (VisualizerJniStorage *)env->GetLongField(thiz, fields.fidJniData); if (lpJniStorage == NULL) { return VISUALIZER_ERROR_NO_INIT; |