Как мне загрузить свой собственный класс Java в C на Android?

Я пытаюсь вызвать некоторый Java-код, который я написал из C с помощью Android NDK. application - это приложение NativeActivity. Мне нужно получить доступ к некоторым функциям, которые доступны только в Java, и эта функциональность требует от вас подкласса другого cla ss, поэтому я не могу напрямую выполнять вызовы из 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: [общая] "ошибка. Когда я распаковываю свой apk, он показывает мне файл classes.dex, в котором, похоже, есть мой класс. Я предполагаю, что есть некоторая тонкость, которую мне не хватает в отношении путей к классам, но я пока не могу ее решить.

Кстати, я могу без проблем выполнять аналогичные вызовы стандартных библиотек Android из C (в том же Функция C выше). В частности, я протестировал вызов Log.v, и он работает и правильно печатает вывод.

Кажется, что все примеры, которые я нахожу, показывают только то, как вызывать обычные библиотеки Java из C, а не библиотеки Java, которые вы написали сами, поэтому Я даже не нашел пример проекта для сравнения.

10
задан itfische 27 July 2011 в 01:09
поделиться