интеграция android Flurry с приложением NDK


Мое приложение для Android состоит из двух частей: frontend, написанный на Java, и game, написанная на C++ с использованием NativeActivity NDK stuff. У меня есть проблема с интеграцией Flurry в мое приложение. Flurry отлично работает в Java-части, но аварийно завершает работу в C++. Более конкретно, вызовите

jni_env->FindClass("com/flurry/android/FlurryAgent");

Приводит к ClassNotFoundException.

jni_env переменная не сломана, потому что я могу получить некоторые Intent парамы, используя ее.

FlurryAgent.jar добавляется в libs dir и в .classpath. Я даже проверил Флажок "заказать и экспортировать" для FlurryAgent.Джар (хотя я понятия не имею, что это значит). Ничего не помогает.

Еще одна деталь: мое приложение разделено на библиотечную и прикладную части. Я добавил FlurryAgent.jar к обеим частям и проверил "заказ и экспорт" в обеих частях, но это все равно не помогает. Чистый и перестраивать ничего не помогло. Я что-то пропустил?

1 4

1 ответ:

Ответ здесь: http://archive.is/QzA8

Другими словами, NativeActivity не может найти сторонний класс и вместо
jni_env->FindClass("com/flurry/android/FlurryAgent");

Следует использовать

jobject nativeActivity = state->activity->clazz;
jclass acl = jni_env->GetObjectClass(nativeActivity);
jmethodID getClassLoader = jni_env->GetMethodID(acl, "getClassLoader", "()Ljava/lang/ClassLoader;");
jobject cls = jni_env->CallObjectMethod(nativeActivity, getClassLoader);
jclass classLoader = jni_env->FindClass("java/lang/ClassLoader");
jmethodID findClass = jni_env->GetMethodID(classLoader, "loadClass", "(Ljava/lang/String;)Ljava/lang/Class;");
jstring strClassName = jni_env->NewStringUTF("com/flurry/android/FlurryAgent");
jclass flurryClass = (jclass)(jni_env->CallObjectMethod(cls, findClass, strClassName));
jni_env->DeleteLocalRef(strClassName);