Browse Source

Do not call (Get|Release)StringUTFChars with a null value as this will crash the eSpeak service.

master
Reece H. Dunn 12 years ago
parent
commit
7007dd7608
1 changed files with 10 additions and 10 deletions
  1. 10
    10
      jni/jni/com_googlecode_eyesfree_espeak_eSpeakService.cpp

+ 10
- 10
jni/jni/com_googlecode_eyesfree_espeak_eSpeakService.cpp View File



env->SetIntField(object, FIELD_mNativeData, (jint) nat); env->SetIntField(object, FIELD_mNativeData, (jint) nat);


const char *c_path = env->GetStringUTFChars(path, NULL);
const char *c_path = path ? env->GetStringUTFChars(path, NULL) : NULL;


nat->object = env->NewWeakGlobalRef(object); nat->object = env->NewWeakGlobalRef(object);
if (DEBUG) LOGV("Initializing with path %s", c_path); if (DEBUG) LOGV("Initializing with path %s", c_path);
nat->sampleRate = espeak_Initialize(AUDIO_OUTPUT_SYNCHRONOUS, nat->bufferSizeInMillis, c_path, 0); nat->sampleRate = espeak_Initialize(AUDIO_OUTPUT_SYNCHRONOUS, nat->bufferSizeInMillis, c_path, 0);


env->ReleaseStringUTFChars(path, c_path);
if (c_path) env->ReleaseStringUTFChars(path, c_path);


if (nat->sampleRate > 0) { if (nat->sampleRate > 0) {
return JNI_TRUE; return JNI_TRUE;
JNICALL Java_com_googlecode_eyesfree_espeak_SpeechSynthesis_nativeSetVoiceByProperties( JNICALL Java_com_googlecode_eyesfree_espeak_SpeechSynthesis_nativeSetVoiceByProperties(
JNIEnv *env, jobject object, jstring name, jstring languages, jint gender, jint age, JNIEnv *env, jobject object, jstring name, jstring languages, jint gender, jint age,
jint variant) { jint variant) {
const char *c_name = env->GetStringUTFChars(name, NULL);
const char *c_languages = env->GetStringUTFChars(languages, NULL);
const char *c_name = name ? env->GetStringUTFChars(name, NULL) : NULL;
const char *c_languages = languages ? env->GetStringUTFChars(languages, NULL) : NULL;


if (DEBUG) LOGV("%s(name=%s, languages=%s)", __FUNCTION__, c_name, c_languages); if (DEBUG) LOGV("%s(name=%s, languages=%s)", __FUNCTION__, c_name, c_languages);




const espeak_ERROR result = espeak_SetVoiceByProperties(&voice_select); const espeak_ERROR result = espeak_SetVoiceByProperties(&voice_select);


env->ReleaseStringUTFChars(name, c_name);
env->ReleaseStringUTFChars(languages, c_languages);
if (c_name) env->ReleaseStringUTFChars(name, c_name);
if (c_languages) env->ReleaseStringUTFChars(languages, c_languages);


if (result == EE_OK) if (result == EE_OK)
return JNI_TRUE; return JNI_TRUE;
JNIEXPORT jboolean JNIEXPORT jboolean
JNICALL Java_com_googlecode_eyesfree_espeak_SpeechSynthesis_nativeSetLanguage( JNICALL Java_com_googlecode_eyesfree_espeak_SpeechSynthesis_nativeSetLanguage(
JNIEnv *env, jobject object, jstring language, jint variant) { JNIEnv *env, jobject object, jstring language, jint variant) {
const char *c_language = env->GetStringUTFChars(language, NULL);
const char *c_language = language ? env->GetStringUTFChars(language, NULL) : NULL;


if (DEBUG) LOGV("%s(language=%s)", __FUNCTION__, c_language); if (DEBUG) LOGV("%s(language=%s)", __FUNCTION__, c_language);


const int len = strlen(c_language); const int len = strlen(c_language);
char *lang_copy = (char *) calloc(len, sizeof(char)); char *lang_copy = (char *) calloc(len, sizeof(char));
strcpy(lang_copy, c_language); strcpy(lang_copy, c_language);
env->ReleaseStringUTFChars(language, c_language);
if (c_language) env->ReleaseStringUTFChars(language, c_language);


espeak_VOICE voice; espeak_VOICE voice;
memset(&voice, 0, sizeof(espeak_VOICE)); // Zero out the voice first memset(&voice, 0, sizeof(espeak_VOICE)); // Zero out the voice first
JNIEnv *env, jobject object, jstring text) { JNIEnv *env, jobject object, jstring text) {
if (DEBUG) LOGV("%s", __FUNCTION__); if (DEBUG) LOGV("%s", __FUNCTION__);
native_data_t *nat = getNativeData(env, object); native_data_t *nat = getNativeData(env, object);
const char *c_text = env->GetStringUTFChars(text, NULL);
const char *c_text = text ? env->GetStringUTFChars(text, NULL) : NULL;
unsigned int unique_identifier; unsigned int unique_identifier;


nat->env = env; nat->env = env;
&unique_identifier, nat); &unique_identifier, nat);
espeak_Synchronize(); espeak_Synchronize();


env->ReleaseStringUTFChars(text, c_text);
if (c_text) env->ReleaseStringUTFChars(text, c_text);


return JNI_TRUE; return JNI_TRUE;
} }

Loading…
Cancel
Save