/*---------------------------------------------------------------------------*
* android_speech_srec_Recognizer.cpp *
* *
* Copyright 2007 Nuance Communciations, Inc. *
* *
* Licensed under the Apache License, Version 2.0 (the 'License'); *
* you may not use this file except in compliance with the License. *
* *
* You may obtain a copy of the License at *
* http://www.apache.org/licenses/LICENSE-2.0 *
* *
* Unless required by applicable law or agreed to in writing, software *
* distributed under the License is distributed on an 'AS IS' BASIS, *
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
* See the License for the specific language governing permissions and *
* limitations under the License. *
* *
*---------------------------------------------------------------------------*/
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <jni.h>
#define LOG_TAG "srec_jni"
#include "utils/Log.h"
#include "passert.h"
#include "ESR_CommandLine.h"
#include "ESR_Session.h"
#include "LCHAR.h"
#include "PFile.h"
#include "PFileSystem.h"
#include "PANSIFileSystem.h"
//#include "PMemoryFileSystem.h"
#include "plog.h"
#include "pmemory.h"
#include "ptypes.h"
#include "SR_Grammar.h"
#include "SR_Recognizer.h"
#include "SR_RecognizerImpl.h"
#include "SR_RecognizerResult.h"
#include "SR_Session.h"
#include "SR_Vocabulary.h"
#include "SR_AcousticState.h"
#include "SR_Nametag.h"
#include "PStackSize.h"
//
// helper function to throw an exception
//
static void JNU_ThrowByName(JNIEnv *env, const char* name, const char* msg) {
jclass cls = env->FindClass(name);
if (cls != NULL) {
env->ThrowNew(cls, msg);
}
env->DeleteLocalRef(cls);
}
static void unimplemented(JNIEnv* env) {
JNU_ThrowByName(env, "java/lang/IllegalStateException", "unimplemented!!!");
}
static void checkEsrError(JNIEnv* env, ESR_ReturnCode esr_status) {
if (esr_status != ESR_SUCCESS) {
JNU_ThrowByName(env, "java/lang/IllegalStateException", ESR_rc2str(esr_status));
}
}
///////////////////////////////////////////////////////////////////////////
// PMem JNI implementations
///////////////////////////////////////////////////////////////////////////
static JNIEXPORT void JNICALL Java_android_speech_srec_Recognizer_PMemInit
(JNIEnv *env, jclass clazz) {
checkEsrError(env, PMemInit());
}
static JNIEXPORT void JNICALL Java_android_speech_srec_Recognizer_PMemShutdown
(JNIEnv *env, jclass clazz) {
checkEsrError(env, PMemShutdown());
}
//////////////////////////////////////////////////////////////////////////
// SR_Session JNI implementations
//////////////////////////////////////////////////////////////////////////
static JNIEXPORT void JNICALL Java_android_speech_srec_Recognizer_SR_1SessionCreate
(JNIEnv *env, jclass clazz, jstring fileName) {
// TODO: check for fileName NPE
const char* fn = env->GetStringUTFChars(fileName, 0);
checkEsrError(env, SR_SessionCreate(fn)); // TODO: can I post this before freeing the string?
env->ReleaseStringUTFChars(fileName, fn);
}
static JNIEXPORT void JNICALL Java_android_speech_srec_Recognizer_SR_1SessionDestroy
(JNIEnv *env, jclass clazz) {
checkEsrError(env, SR_SessionDestroy());
}
//////////////////////////////////////////////////////////////////////////
// SR_Recognizer JNI implementations
//////////////////////////////////////////////////////////////////////////
static JNIEXPORT void JNICALL Java_android_speech_srec_Recognizer_SR_1RecognizerStart
(JNIEnv *env, jclass clazz, jlong recognizer) {
checkEsrError(env, SR_RecognizerStart((SR_Recognizer*)recognizer));
}
static JNIEXPORT void JNICALL Java_android_speech_srec_Recognizer_SR_1RecognizerStop
(JNIEnv *env, jclass clazz, jlong recognizer) {
checkEsrError(env, SR_RecognizerStop((SR_Recognizer*)recognizer));
}
static JNIEXPORT jlong JNICALL Java_android_speech_srec_Recognizer_SR_1RecognizerCreate
(JNIEnv *env, jclass clazz) {
SR_Recognizer* recognizer = NULL;
// TODO: do we need to clean up the recognizer if this fails?
checkEsrError(env, SR_RecognizerCreate(&recognizer));
return (jlong)recognizer;
}
static JNIEXPORT void JNICALL Java_android_speech_srec_Recognizer_SR_1RecognizerDestroy
(JNIEnv *env, jclass clazz, jlong recognizer) {
checkEsrError(env, SR_RecognizerDestroy((SR_Recognizer*)recognizer));
return;
}
static JNIEXPORT void JNICALL Java_android_speech_srec_Recognizer_SR_1RecognizerSetup
(JNIEnv *env, jclass clazz, jlong recognizer) {
checkEsrError(env, SR_RecognizerSetup((SR_Recognizer*)recognizer));
return;
}
static JNIEXPORT void JNICALL Java_android_speech_srec_Recognizer_SR_1RecognizerUnsetup
(JNIEnv *env, jclass clazz, jlong recognizer) {
checkEsrError(env, SR_RecognizerUnsetup((SR_Recognizer*)recognizer));
return;
}
static JNIEXPORT jboolean JNICALL Java_android_speech_srec_Recognizer_SR_1RecognizerIsSetup
(JNIEnv *env, jclass clazz, jlong recognizer) {
ESR_BOOL rtn = ESR_FALSE;
checkEsrError(env, SR_RecognizerIsSetup((SR_Recognizer*)recognizer, &rtn));
return rtn;
}
static JNIEXPORT jstring JNICALL Java_android_speech_srec_Recognizer_SR_1RecognizerGetParameter
(JNIEnv *env, jclass clazz, jlong recognizer, jstring key) {
unimplemented(env);
return 0;
}
static JNIEXPORT jint JNICALL Java_android_speech_srec_Recognizer_SR_1RecognizerGetSize_1tParameter
(JNIEnv *env, jclass clazz, jlong recognizer, jstring key) {
unimplemented(env);
return 0;
}
static JNIEXPORT jboolean JNICALL Java_android_speech_srec_Recognizer_SR_1RecognizerGetBoolParameter
(JNIEnv *env, jclass clazz, jlong recognizer, jstring key) {
unimplemented(env);
return JNI_FALSE;
}
static JNIEXPORT void JNICALL Java_android_speech_srec_Recognizer_SR_1RecognizerSetParameter
(JNIEnv *env, jclass clazz, jlong recognizer, jstring key, jstring value) {
unimplemented(env);
return;
}
static JNIEXPORT void JNICALL Java_android_speech_srec_Recognizer_SR_1RecognizerSetSize_1tParameter
(JNIEnv *env, jclass clazz, jlong recognizer, jstring key, jint value) {
unimplemented(env);
return;
}
static JNIEXPORT void JNICALL Java_android_speech_srec_Recognizer_SR_1RecognizerSetBoolParameter
(JNIEnv *env, jclass clazz, jlong recognizer, jstring key , jboolean value) {
unimplemented(env);
return;
}
static JNIEXPORT void JNICALL Java_android_speech_srec_Recognizer_SR_1RecognizerSetupRule
(JNIEnv *env, jclass clazz, jlong recognizer, jlong grammar, jstring ruleName) {
const char* rn = env->GetStringUTFChars(ruleName, 0);
checkEsrError(env, SR_RecognizerSetupRule((SR_Recognizer*)recognizer, (SR_Grammar*)grammar, rn));
env->ReleaseStringUTFChars(ruleName, rn);
}
static JNIEXPORT jboolean JNICALL Java_android_speech_srec_Recognizer_SR_1RecognizerHasSetupRules
(JNIEnv *env, jclass clazz, jlong recognizer) {
ESR_BOOL rtn = ESR_FALSE;
checkEsrError(env, SR_RecognizerHasSetupRules((SR_Recognizer*)recognizer, &rtn));
return rtn;
}
static JNIEXPORT void JNICALL Java_android_speech_srec_Recognizer_SR_1RecognizerActivateRule
(JNIEnv *env, jclass clazz, jlong recognizer, jlong grammar, jstring ruleName, jint weight) {
const char* rn = env->GetStringUTFChars(ruleName, 0);
checkEsrError(env, SR_RecognizerActivateRule((SR_Recognizer*)recognizer, (SR_Grammar*)grammar, rn, weight));
env->ReleaseStringUTFChars(ruleName, rn);
}
static JNIEXPORT void JNICALL Java_android_speech_srec_Recognizer_SR_1RecognizerDeactivateRule
(JNIEnv *env, jclass clazz, jlong recognizer, jlong grammar, jstring ruleName) {
const char* rn = env->GetStringUTFChars(ruleName, 0);
checkEsrError(env, SR_RecognizerDeactivateRule((SR_Recognizer*)recognizer, (SR_Grammar*)grammar, rn));
env->ReleaseStringUTFChars(ruleName, rn);
}
static JNIEXPORT void JNICALL Java_android_speech_srec_Recognizer_SR_1RecognizerDeactivateAllRules
(JNIEnv *env, jclass clazz, jlong recognizer) {
checkEsrError(env, SR_RecognizerDeactivateAllRules((SR_Recognizer*)recognizer));
}
static JNIEXPORT jboolean JNICALL Java_android_speech_srec_Recognizer_SR_1RecognizerIsActiveRule
(JNIEnv *env, jclass clazz, jlong recognizer, jlong grammar, jstring ruleName) {
ESR_BOOL rtn = ESR_FALSE;
const char* rn = env->GetStringUTFChars(ruleName, 0);
checkEsrError(env, SR_RecognizerIsActiveRule((SR_Recognizer*)recognizer, (SR_Grammar*)grammar, rn, &rtn));
env->ReleaseStringUTFChars(ruleName, rn);
return rtn;
}
static JNIEXPORT jboolean JNICALL Java_android_speech_srec_Recognizer_SR_1RecognizerCheckGrammarConsistency
(JNIEnv *env, jclass clazz, jlong recognizer, jlong grammar) {
ESR_BOOL rtn = ESR_FALSE;
checkEsrError(env, SR_RecognizerCheckGrammarConsistency((SR_Recognizer*)recognizer, (SR_Grammar*)grammar, &rtn));
return rtn;
}
static JNIEXPORT jint JNICALL Java_android_speech_srec_Recognizer_SR_1RecognizerPutAudio
(JNIEnv *env, jclass clazz, jlong recognizer, jbyteArray audio, jint offset, jint length, jboolean isLast) {
// set the length
jbyte buffer[1024];
if (length > (int)sizeof(buffer)) length = sizeof(buffer);
size_t samples = length / sizeof(asr_int16_t);
length = samples * sizeof(asr_int16_t);
// fetch data from java
env->GetByteArrayRegion(audio, offset, length, buffer);
// put the samples into the recognizer
checkEsrError(env, SR_RecognizerPutAudio((SR_Recognizer*)recognizer,
(asr_int16_t*)buffer, &samples, isLast ? ESR_TRUE : ESR_FALSE));
if (samples != length / sizeof(asr_int16_t)) {
checkEsrError(env, ESR_READ_ERROR);
return 0;
}
return samples * sizeof(asr_int16_t);
}
static JNIEXPORT jint JNICALL Java_android_speech_srec_Recognizer_SR_1RecognizerAdvance
(JNIEnv *env, jclass clazz, jlong recognizer) {
SR_RecognizerStatus status = SR_RECOGNIZER_EVENT_INVALID;
SR_RecognizerResultType type = SR_RECOGNIZER_RESULT_TYPE_INVALID;
SR_RecognizerResult* recognizerResult = NULL;
checkEsrError(env, SR_RecognizerAdvance((SR_Recognizer*)recognizer, &status, &type, &recognizerResult));
return status;
}
static JNIEXPORT jboolean JNICALL Java_android_speech_srec_Recognizer_SR_1RecognizerIsSignalClipping
(JNIEnv *env, jclass clazz, jlong recognizer) {
ESR_BOOL rtn = ESR_FALSE;
checkEsrError(env, SR_RecognizerIsSignalClipping((SR_Recognizer*)recognizer, &rtn));
return rtn;
}
static JNIEXPORT jboolean JNICALL Java_android_speech_srec_Recognizer_SR_1RecognizerIsSignalDCOffset
(JNIEnv *env, jclass clazz, jlong recognizer) {
ESR_BOOL rtn = ESR_FALSE;
checkEsrError(env, SR_RecognizerIsSignalDCOffset((SR_Recognizer*)recognizer, &rtn));
return rtn;
}
static JNIEXPORT jboolean JNICALL Java_android_speech_srec_Recognizer_SR_1RecognizerIsSignalNoisy
(JNIEnv *env, jclass clazz, jlong recognizer) {
ESR_BOOL rtn = ESR_FALSE;
checkEsrError(env, SR_RecognizerIsSignalNoisy((SR_Recognizer*)recognizer, &rtn));
return rtn;
}
static JNIEXPORT jboolean JNICALL Java_android_speech_srec_Recognizer_SR_1RecognizerIsSignalTooQuiet
(JNIEnv *env, jclass clazz, jlong recognizer) {
ESR_BOOL rtn = ESR_FALSE;
checkEsrError(env, SR_RecognizerIsSignalTooQuiet((SR_Recognizer*)recognizer, &rtn));
return rtn;
}
static JNIEXPORT jboolean JNICALL Java_android_speech_srec_Recognizer_SR_1RecognizerIsSignalTooFewSamples
(JNIEnv *env, jclass clazz, jlong recognizer) {
ESR_BOOL rtn = ESR_FALSE;
checkEsrError(env, SR_RecognizerIsSignalTooFewSamples((SR_Recognizer*)recognizer, &rtn));
return rtn;
}
static JNIEXPORT jboolean JNICALL Java_android_speech_srec_Recognizer_SR_1RecognizerIsSignalTooManySamples
(JNIEnv *env, jclass clazz, jlong recognizer) {
ESR_BOOL rtn = ESR_FALSE;
checkEsrError(env, SR_RecognizerIsSignalTooManySamples((SR_Recognizer*)recognizer, &rtn));
return rtn;
}
//////////////////////////////////////////////////////////////////////////
// SR_AcousticState JNI implementations
//////////////////////////////////////////////////////////////////////////
static JNIEXPORT void JNICALL Java_android_speech_srec_Recognizer_SR_1AcousticStateReset
(JNIEnv *env, jclass clazz, jlong recognizer) {
checkEsrError(env, SR_AcousticStateReset((SR_Recognizer*)recognizer));
}
static JNIEXPORT void JNICALL Java_android_speech_srec_Recognizer_SR_1AcousticStateSet
(JNIEnv *env, jclass clazz, jlong recognizer, jstring state) {
const char* st = env->GetStringUTFChars(state, 0);
checkEsrError(env, SR_AcousticStateSet((SR_Recognizer*)recognizer, st));
env->ReleaseStringUTFChars(state, st);
}
static JNIEXPORT jstring JNICALL Java_android_speech_srec_Recognizer_SR_1AcousticStateGet
(JNIEnv *env, jclass clazz, jlong recognizer) {
char rtn[1000];
size_t rtnLength = sizeof(rtn) - 1;
ESR_ReturnCode esr_status = SR_AcousticStateGet((SR_Recognizer*)recognizer, rtn, &rtnLength);
if (esr_status) {
checkEsrError(env, esr_status);
return NULL;
}
rtn[rtnLength] = 0;
return env->NewStringUTF(rtn);
}
//////////////////////////////////////////////////////////////////////////
// SR_Grammar JNI implementations
//////////////////////////////////////////////////////////////////////////
static JNIEXPORT void JNICALL Java_android_speech_srec_Recognizer_SR_1GrammarCompile
(JNIEnv *env, jclass clazz, jlong grammar) {
checkEsrError(env, SR_GrammarCompile((SR_Grammar*)grammar));
}
static JNIEXPORT void JNICALL Java_android_speech_srec_Recognizer_SR_1GrammarAddWordToSlot
(JNIEnv *env, jclass clazz, jlong grammar, jstring slot, jstring word, jstring pronunciation, jint weight, jstring tag) {
const char* sl = 0;
const char* wo = 0;
const char* pr = 0;
const char* ta = 0;
if ((sl = env->GetStringUTFChars(slot, 0)) &&
(wo = env->GetStringUTFChars(word, 0)) &&
(!pronunciation || (pr = env->GetStringUTFChars(pronunciation, 0))) &&
(ta = env->GetStringUTFChars(tag, 0))) {
checkEsrError(env, SR_GrammarAddWordToSlot((SR_Grammar*)grammar, sl, wo, pr, weight, ta));
}
if (ta) env->ReleaseStringUTFChars(tag, ta);
if (pr) env->ReleaseStringUTFChars(pronunciation, pr);
if (wo) env->ReleaseStringUTFChars(word, wo);
if (sl) env->ReleaseStringUTFChars(slot, sl);
}
static JNIEXPORT void JNICALL Java_android_speech_srec_Recognizer_SR_1GrammarResetAllSlots
(JNIEnv *env, jclass clazz, jlong grammar) {
checkEsrError(env, SR_GrammarResetAllSlots((SR_Grammar*)grammar));
}
static JNIEXPORT void JNICALL Java_android_speech_srec_Recognizer_SR_1GrammarSetupVocabulary
(JNIEnv *env, jclass clazz, jlong grammar, jlong vocabulary) {
checkEsrError(env, SR_GrammarSetupVocabulary((SR_Grammar*)grammar, (SR_Vocabulary*)vocabulary));
}
static JNIEXPORT void JNICALL Java_android_speech_srec_Recognizer_SR_1GrammarSetupRecognizer
(JNIEnv *env, jclass clazz, jlong grammar, jlong recognizer) {
checkEsrError(env, SR_GrammarSetupRecognizer((SR_Grammar*)grammar, (SR_Recognizer*)recognizer));
}
static JNIEXPORT void JNICALL Java_android_speech_srec_Recognizer_SR_1GrammarUnsetupRecognizer
(JNIEnv *env, jclass clazz, jlong grammar) {
checkEsrError(env, SR_GrammarUnsetupRecognizer((SR_Grammar*)grammar));
}
static JNIEXPORT jlong JNICALL Java_android_speech_srec_Recognizer_SR_1GrammarCreate
(JNIEnv *env, jclass clazz) {
SR_Grammar* grammar = 0;
checkEsrError(env, SR_GrammarCreate(&grammar));
return (jlong)grammar;
}
static JNIEXPORT void JNICALL Java_android_speech_srec_Recognizer_SR_1GrammarDestroy
(JNIEnv *env, jclass clazz, jlong grammar) {
checkEsrError(env, SR_GrammarDestroy((SR_Grammar*)grammar));
}
static JNIEXPORT jlong JNICALL Java_android_speech_srec_Recognizer_SR_1GrammarLoad
(JNIEnv *env, jclass clazz, jstring fileName) {
// TODO: check for fileName NPE
SR_Grammar* grammar = 0;
const char* fn = env->GetStringUTFChars(fileName, 0);
checkEsrError(env, SR_GrammarLoad(fn, &grammar));
env->ReleaseStringUTFChars(fileName, fn);
return (jlong)grammar;
}
static JNIEXPORT void JNICALL Java_android_speech_srec_Recognizer_SR_1GrammarSave
(JNIEnv *env, jclass clazz, jlong grammar, jstring fileName) {
const char* fn = env->GetStringUTFChars(fileName, 0);
checkEsrError(env, SR_GrammarSave((SR_Grammar*)grammar, fn));
env->ReleaseStringUTFChars(fileName, fn);
}
static JNIEXPORT void JNICALL Java_android_speech_srec_Recognizer_SR_1GrammarAllowOnly
(JNIEnv *env, jclass clazz, jlong grammar, jstring transcription) {
const char* tr = env->GetStringUTFChars(transcription, 0);
checkEsrError(env, SR_GrammarSave((SR_Grammar*)grammar, tr));
env->ReleaseStringUTFChars(transcription, tr);
}
static JNIEXPORT void JNICALL Java_android_speech_srec_Recognizer_SR_1GrammarAllowAll
(JNIEnv *env, jclass clazz, jlong grammar) {
checkEsrError(env, SR_GrammarAllowAll((SR_Grammar*)grammar));
}
//////////////////////////////////////////////////////////////////////////
// SR_Vocabulary JNI implementations
//////////////////////////////////////////////////////////////////////////
static JNIEXPORT jlong JNICALL Java_android_speech_srec_Recognizer_SR_1VocabularyLoad
(JNIEnv *env, jclass clazz) {
char filename[P_PATH_MAX];
size_t flen = sizeof(filename) - 1;
checkEsrError(env, ESR_SessionGetLCHAR ( L("cmdline.vocabulary"), filename, &flen ));
filename[sizeof(filename) - 1] = 0;
// TODO: do we need to clean up the recognizer if this fails?
SR_Vocabulary* vocabulary = NULL;
checkEsrError(env, SR_VocabularyLoad(filename, &vocabulary));
return (jlong)vocabulary;
}
static JNIEXPORT void JNICALL Java_android_speech_srec_Recognizer_SR_1VocabularyDestroy
(JNIEnv *env, jclass clazz, jlong vocabulary) {
// TODO: do we need to clean up the recognizer if this fails?
checkEsrError(env, SR_VocabularyDestroy((SR_Vocabulary*)vocabulary));
}
static JNIEXPORT jstring JNICALL Java_android_speech_srec_Recognizer_SR_1VocabularyGetPronunciation
(JNIEnv *env, jclass clazz, jlong vocabulary, jstring word) {
char rtn[1000];
size_t rtnLength = sizeof(rtn) - 1;
const char* wo = env->GetStringUTFChars(word, 0);
ESR_ReturnCode esr_status = SR_VocabularyGetPronunciation((SR_Vocabulary*)vocabulary, wo, rtn, &rtnLength);
env->ReleaseStringUTFChars(word, wo);
if (esr_status) {
checkEsrError(env, esr_status);
return NULL;
}
rtn[rtnLength] = 0;
return env->NewStringUTF(rtn);
}
//////////////////////////////////////////////////////////////////////////
// SR_RecognizerResult JNI implementations
//////////////////////////////////////////////////////////////////////////
static JNIEXPORT jbyteArray JNICALL Java_android_speech_srec_Recognizer_SR_1RecognizerResultGetWaveform
(JNIEnv *env, jclass clazz, jlong recognizer) {
unimplemented(env);
return 0;
}
static JNIEXPORT jint JNICALL Java_android_speech_srec_Recognizer_SR_1RecognizerResultGetSize
(JNIEnv *env, jclass clazz, jlong recognizer) {
size_t size = 0;
checkEsrError(env, SR_RecognizerResultGetSize(((SR_RecognizerImpl*)recognizer)->result, &size));
return size;
}
static JNIEXPORT jint JNICALL Java_android_speech_srec_Recognizer_SR_1RecognizerResultGetKeyCount
(JNIEnv *env, jclass clazz, jlong recognizer, jint nbest) {
size_t size = 0;
checkEsrError(env, SR_RecognizerResultGetKeyCount(((SR_RecognizerImpl*)recognizer)->result, nbest, &size));
return size;
}
static JNIEXPORT jobjectArray JNICALL Java_android_speech_srec_Recognizer_SR_1RecognizerResultGetKeyList
(JNIEnv *env, jclass clazz, jlong recognizer, jint nbest) {
// fetch list
LCHAR* list[200];
size_t listSize = sizeof(list) / sizeof(list[0]);
ESR_ReturnCode esr_status = SR_RecognizerResultGetKeyList(((SR_RecognizerImpl*)recognizer)->result, nbest, list, &listSize);
if (esr_status) {
checkEsrError(env, esr_status);
return NULL;
}
// create String[] of keys
jclass stringClass = env->FindClass("java/lang/String");
if (!stringClass) return NULL;
jobjectArray array = env->NewObjectArray(listSize, stringClass, NULL);
if (!array) return NULL;
// fill it
for (size_t i = 0; i < listSize; i++) {
// generate new String for key
jstring key = env->NewStringUTF(list[i]);
if (!key) return NULL;
// set the array
env->SetObjectArrayElement(array, i, key);
env->DeleteLocalRef(key);
}
return array;
}
static JNIEXPORT jstring JNICALL Java_android_speech_srec_Recognizer_SR_1RecognizerResultGetValue
(JNIEnv *env, jclass clazz, jlong recognizer, jint nbest, jstring key) {
char rtn[1000];
size_t rtnLength = sizeof(rtn) - 1;
const char* ke = env->GetStringUTFChars(key, 0);
ESR_ReturnCode esr_status = SR_RecognizerResultGetValue(((SR_RecognizerImpl*)recognizer)->result, nbest, ke, rtn, &rtnLength);
env->ReleaseStringUTFChars(key, ke);
if (esr_status) {
checkEsrError(env, esr_status);
return NULL;
}
rtn[rtnLength] = 0;
return env->NewStringUTF(rtn);
}
/*
* Table of methods associated with a single class.
*/
static JNINativeMethod gMethods[] = {
/* name, signature, funcPtr */
// PMem
{"PMemInit", "()V", (void*)Java_android_speech_srec_Recognizer_PMemInit},
{"PMemShutdown", "()V", (void*)Java_android_speech_srec_Recognizer_PMemShutdown},
// SR_Session
{"SR_SessionCreate", "(Ljava/lang/String;)V", (void*)Java_android_speech_srec_Recognizer_SR_1SessionCreate},
{"SR_SessionDestroy", "()V", (void*)Java_android_speech_srec_Recognizer_SR_1SessionDestroy},
// SR_Recognizer
{"SR_RecognizerStart", "(J)V", (void*)Java_android_speech_srec_Recognizer_SR_1RecognizerStart},
{"SR_RecognizerStop", "(J)V", (void*)Java_android_speech_srec_Recognizer_SR_1RecognizerStop},
{"SR_RecognizerCreate", "()J", (void*)Java_android_speech_srec_Recognizer_SR_1RecognizerCreate},
{"SR_RecognizerDestroy", "(J)V", (void*)Java_android_speech_srec_Recognizer_SR_1RecognizerDestroy},
{"SR_RecognizerSetup", "(J)V", (void*)Java_android_speech_srec_Recognizer_SR_1RecognizerSetup},
{"SR_RecognizerUnsetup", "(J)V", (void*)Java_android_speech_srec_Recognizer_SR_1RecognizerUnsetup},
{"SR_RecognizerIsSetup", "(J)Z", (void*)Java_android_speech_srec_Recognizer_SR_1RecognizerIsSetup},
{"SR_RecognizerGetParameter", "(JLjava/lang/String;)Ljava/lang/String;", (void*)Java_android_speech_srec_Recognizer_SR_1RecognizerGetParameter},
{"SR_RecognizerGetSize_tParameter", "(JLjava/lang/String;)I", (void*)Java_android_speech_srec_Recognizer_SR_1RecognizerGetSize_1tParameter},
{"SR_RecognizerGetBoolParameter", "(JLjava/lang/String;)Z", (void*)Java_android_speech_srec_Recognizer_SR_1RecognizerGetBoolParameter},
{"SR_RecognizerSetParameter", "(JLjava/lang/String;Ljava/lang/String;)V", (void*)Java_android_speech_srec_Recognizer_SR_1RecognizerSetParameter},
{"SR_RecognizerSetSize_tParameter", "(JLjava/lang/String;I)V", (void*)Java_android_speech_srec_Recognizer_SR_1RecognizerSetSize_1tParameter},
{"SR_RecognizerSetBoolParameter", "(JLjava/lang/String;Z)V", (void*)Java_android_speech_srec_Recognizer_SR_1RecognizerSetBoolParameter},
{"SR_RecognizerSetupRule", "(JJLjava/lang/String;)V", (void*)Java_android_speech_srec_Recognizer_SR_1RecognizerSetupRule},
{"SR_RecognizerHasSetupRules", "(J)Z", (void*)Java_android_speech_srec_Recognizer_SR_1RecognizerHasSetupRules},
{"SR_RecognizerActivateRule", "(JJLjava/lang/String;I)V", (void*)Java_android_speech_srec_Recognizer_SR_1RecognizerActivateRule},
{"SR_RecognizerDeactivateRule", "(JJLjava/lang/String;)V", (void*)Java_android_speech_srec_Recognizer_SR_1RecognizerDeactivateRule},
{"SR_RecognizerDeactivateAllRules", "(J)V", (void*)Java_android_speech_srec_Recognizer_SR_1RecognizerDeactivateAllRules},
{"SR_RecognizerIsActiveRule", "(JJLjava/lang/String;)Z", (void*)Java_android_speech_srec_Recognizer_SR_1RecognizerIsActiveRule},
{"SR_RecognizerCheckGrammarConsistency", "(JJ)Z", (void*)Java_android_speech_srec_Recognizer_SR_1RecognizerCheckGrammarConsistency},
{"SR_RecognizerPutAudio", "(J[BIIZ)I", (void*)Java_android_speech_srec_Recognizer_SR_1RecognizerPutAudio},
{"SR_RecognizerAdvance", "(J)I", (void*)Java_android_speech_srec_Recognizer_SR_1RecognizerAdvance},
{"SR_RecognizerIsSignalClipping", "(J)Z", (void*)Java_android_speech_srec_Recognizer_SR_1RecognizerIsSignalClipping},
{"SR_RecognizerIsSignalDCOffset", "(J)Z", (void*)Java_android_speech_srec_Recognizer_SR_1RecognizerIsSignalDCOffset},
{"SR_RecognizerIsSignalNoisy", "(J)Z", (void*)Java_android_speech_srec_Recognizer_SR_1RecognizerIsSignalNoisy},
{"SR_RecognizerIsSignalTooQuiet", "(J)Z", (void*)Java_android_speech_srec_Recognizer_SR_1RecognizerIsSignalTooQuiet},
{"SR_RecognizerIsSignalTooFewSamples", "(J)Z", (void*)Java_android_speech_srec_Recognizer_SR_1RecognizerIsSignalTooFewSamples},
{"SR_RecognizerIsSignalTooManySamples", "(J)Z", (void*)Java_android_speech_srec_Recognizer_SR_1RecognizerIsSignalTooManySamples},
// SR_AcousticState
{"SR_AcousticStateReset", "(J)V", (void*)Java_android_speech_srec_Recognizer_SR_1AcousticStateReset},
{"SR_AcousticStateSet", "(JLjava/lang/String;)V", (void*)Java_android_speech_srec_Recognizer_SR_1AcousticStateSet},
{"SR_AcousticStateGet", "(J)Ljava/lang/String;", (void*)Java_android_speech_srec_Recognizer_SR_1AcousticStateGet},
// SR_Grammar
{"SR_GrammarCompile", "(J)V", (void*)Java_android_speech_srec_Recognizer_SR_1GrammarCompile},
{"SR_GrammarAddWordToSlot", "(JLjava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;)V", (void*)Java_android_speech_srec_Recognizer_SR_1GrammarAddWordToSlot},
{"SR_GrammarResetAllSlots", "(J)V", (void*)Java_android_speech_srec_Recognizer_SR_1GrammarResetAllSlots},
{"SR_GrammarSetupVocabulary", "(JJ)V", (void*)Java_android_speech_srec_Recognizer_SR_1GrammarSetupVocabulary},
{"SR_GrammarSetupRecognizer", "(JJ)V", (void*)Java_android_speech_srec_Recognizer_SR_1GrammarSetupRecognizer},
{"SR_GrammarUnsetupRecognizer", "(J)V", (void*)Java_android_speech_srec_Recognizer_SR_1GrammarUnsetupRecognizer},
{"SR_GrammarCreate", "()J", (void*)Java_android_speech_srec_Recognizer_SR_1GrammarCreate},
{"SR_GrammarDestroy", "(J)V", (void*)Java_android_speech_srec_Recognizer_SR_1GrammarDestroy},
{"SR_GrammarLoad", "(Ljava/lang/String;)J", (void*)Java_android_speech_srec_Recognizer_SR_1GrammarLoad},
{"SR_GrammarSave", "(JLjava/lang/String;)V", (void*)Java_android_speech_srec_Recognizer_SR_1GrammarSave},
{"SR_GrammarAllowOnly", "(JLjava/lang/String;)V", (void*)Java_android_speech_srec_Recognizer_SR_1GrammarAllowOnly},
{"SR_GrammarAllowAll", "(J)V", (void*)Java_android_speech_srec_Recognizer_SR_1GrammarAllowAll},
// SR_Vocabulary
{"SR_VocabularyLoad", "()J", (void*)Java_android_speech_srec_Recognizer_SR_1VocabularyLoad},
{"SR_VocabularyDestroy", "(J)V", (void*)Java_android_speech_srec_Recognizer_SR_1VocabularyDestroy},
{"SR_VocabularyGetPronunciation", "(JLjava/lang/String;)Ljava/lang/String;", (void*)Java_android_speech_srec_Recognizer_SR_1VocabularyGetPronunciation},
// SR_RecognizerResult
{"SR_RecognizerResultGetWaveform", "(J)[B", (void*)Java_android_speech_srec_Recognizer_SR_1RecognizerResultGetWaveform},
{"SR_RecognizerResultGetSize", "(J)I", (void*)Java_android_speech_srec_Recognizer_SR_1RecognizerResultGetSize},
{"SR_RecognizerResultGetKeyCount", "(JI)I", (void*)Java_android_speech_srec_Recognizer_SR_1RecognizerResultGetKeyCount},
{"SR_RecognizerResultGetKeyList", "(JI)[Ljava/lang/String;", (void*)Java_android_speech_srec_Recognizer_SR_1RecognizerResultGetKeyList},
{"SR_RecognizerResultGetValue", "(JILjava/lang/String;)Ljava/lang/String;", (void*)Java_android_speech_srec_Recognizer_SR_1RecognizerResultGetValue},
};
/*
* Returns the JNI version on success, -1 on failure.
*/
jint register_android_speech_srec_Recognizer(JavaVM* vm, void* reserved)
{
JNIEnv* env = NULL;
jclass clazz = NULL;
const char* className = "android/speech/srec/Recognizer";
if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
ALOGE("ERROR: GetEnv failed\n");
return -1;
}
assert(env != NULL);
clazz = env->FindClass(className);
if (clazz == NULL) {
ALOGE("Native registration unable to find class '%s'\n", className);
return -1;
}
if (env->RegisterNatives(clazz, gMethods,
sizeof(gMethods) / sizeof(gMethods[0])) < 0) {
ALOGE("RegisterNatives failed for '%s'\n", className);
return -1;
}
/* success -- return valid version number */
return JNI_VERSION_1_4;
}
extern jint register_android_speech_srec_MicrophoneInputStream(JavaVM* vm, void* reserved);
jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
if (register_android_speech_srec_MicrophoneInputStream(vm, reserved) != JNI_VERSION_1_4 ||
register_android_speech_srec_Recognizer(vm, reserved) != JNI_VERSION_1_4) return -1;
return JNI_VERSION_1_4;
}