Импортировано из https://github.com/katchsvartanian/voiceRecognition. Всякий раз, когда я запускаю проект на Android-версии выше, Kitkat LogCat отображается ниже ошибка:
JNI DETECTED ERROR IN APPLICATION: illegal class name 'com.example.jni.FLACStreamEncoder'
(should be of the form 'package/Class', [Lpackage/Class;' or '[[B')
in call to FindClass
from void com.example.jni.FLACStreamEncoder.init(java.lang.String, int, int, int)
Появляется ошибка в нижней строке:
init(outfile, sample_rate, channels, bits_per_sample)
в FLACStreamEncoder.java в функции ниже.
public FLACStreamEncoder(String outfile, int sample_rate, int channels,int bits_per_sample)
{
init(outfile, sample_rate, channels, bits_per_sample);
}
и в FLACRecorder.java:
mEncoder = new FLACStreamEncoder (mPath, sample_rate, mapped_channels, mapped_format)
Мой FLACStreamEncoder.cpp содержит приведенный ниже код, и я изменился:
static char const * const FLACStreamEncoder_classname="com.example.jni.FLACStreamEncoder";
в
static char const * const FLACStreamEncoder_classname="com/example/jni/FLACStreamEncoder";
Когда я запускаю код после внесения вышеуказанных изменений и когда наведу курсор на ошибку:
jclass cls = env->FindClass(FLACStreamEncoder_classname);
он показывает подсказку как «jclass и jclass не совместимы». Я не очень хорош в C ++. Мой FLACStreamEncoder.cpp содержит приведенный ниже код.
...
static FLACStreamEncoder * get_encoder(JNIEnv * env, jobject obj)
{
assert(sizeof(jlong) >= sizeof(FLACStreamEncoder *));
// Do the JNI dance for getting the mObject field
jclass cls = env->FindClass(FLACStreamEncoder_classname);
jfieldID object_field = env->GetFieldID(cls, FLACStreamEncoder_mObject,"J");
jlong encoder_value = env->GetLongField(obj, object_field);
env->DeleteLocalRef(cls);
return reinterpret_cast<FLACStreamEncoder *>(encoder_value);
}
static void set_encoder(JNIEnv * env, jobject obj, FLACStreamEncoder * encoder)
{
assert(sizeof(jlong) >= sizeof(FLACStreamEncoder *));
// Do the JNI dance for setting the mObject field
jlong encoder_value = reinterpret_cast<jlong>(encoder);
jclass cls = env->FindClass(FLACStreamEncoder_classname);
jfieldID object_field = env->GetFieldID(cls, FLACStreamEncoder_mObject, "J");
env->SetLongField(obj, object_field, encoder_value);
env->DeleteLocalRef(cls);
}
...
Я сделал изменения по ссылке android art runtime check_jni.cc ошибка в имени пакета.
Что я хочу знать, даже после внесения изменений в путь к классам, почему он показывает ту же ошибку?
'com.example.jni.FLACStreamEncoder' to "com/example/jni/FLACStreamEncoder"
это все еще показывает ту же ошибку в LogCat.
Задача ещё не решена.
Других решений пока нет …