Я пытаюсь вызвать некоторый код Java, написанный на C, с помощью Android NDK. Приложение является приложением NativeActivity. Мне нужно получить доступ к некоторым функциям, которые доступны только в Java, и эта функция требует от вас подкласса другого класса, поэтому я не могу просто напрямую выполнять вызовы из C. Таким образом, у меня есть такой код Java:
// src/com/example/my/package/SubClass.java
package com.example.my.package;
import android.foo.TheSuperClass;
public class SubClass extends TheSuperClass {
public SubClass() {
setImportantProperty(true);
}
}
У меня также есть код C, подобный этому:
// Some file.c
void setThatImportantJavaProperty() {
JavaVM *vm = AndroidGetJavaVM(); // This returns a valid JavaVM object
JNIEnv* env;
(*vm)->AttachCurrentThread(vm, &env, 0);
jclass theSubClass = (*env)->FindClass(env, "com/example/my/package/SubClass");
jthrowable exception = (*env)->ExceptionOccurred(env);
if (exception) {
(*env)->ExceptionDescribe(env);
// This gives me: "java.lang.NoClassDefFoundError: [generic]".
// Also, theSubClass is null, so the next line causes a segfault.
}
jmethodID theSubClassConstructor = (*env)->GetMethodID(env, theSubClass, "<init>", "()V");
jobject theSubClassObject = (*env)->NewObject(env, theSubClass, theSubClassConstructor);
(*env)->DeleteLocalRef(env, theSubClass);
(*env)->DeleteLocalRef(env, theSubClassConstructor);
(*env)->DeleteLocalRef(env, theSubClassObject);
(*vm)->DetachCurrentThread(vm);
}
Как говорится во встроенных комментариях, выполнение этого дает мне ошибку "java.lang.NoClassDefFoundError: [generic]". Когда я распаковываю свой apk, он показывает мне файл classes.dex, в котором, похоже, есть мой класс. Я предполагаю, что есть некоторая тонкость, которую мне не хватает в отношении путей к классам, но я пока не могу ее разрешить.
Между прочим, я могу без проблем выполнять аналогичные вызовы стандартных библиотек Android из C (в той же функции C, что и выше). В частности, я протестировал вызов Log.v, и он работает и правильно печатает вывод.
Кажется, что все примеры, которые я нахожу, показывают, как вызывать обычные библиотеки Java из C, а не библиотеки Java, которые вы написали сами, поэтому я даже не нашел пример проекта для сравнения.