android Flurry与NDK应用程序集成

Nic*_*ick 6 android flurry

我的Android应用程序包括两部分:用Java编写的前端和用C++编写的使用NativeActivity NDK的游戏.我有一个问题将Flurry集成到我的应用程序中.Flurry在Java部分中运行良好,但在C++中崩溃.更具体地说,打电话

jni_env->FindClass("com/flurry/android/FlurryAgent");
Run Code Online (Sandbox Code Playgroud)

结果ClassNotFoundException.

jni_env变量没有被破坏,因为我能够Intent使用它获得一些参数.

FlurryAgent.jar被添加到libsdir并进入.classpath.我甚至为FlurryAgent.jar检查了"订单和导出"复选框(虽然我不知道它是什么意思).什么都没有帮助.

还有一个细节:我的应用程序分为Library和App部分.我已经将FlurryAgent.jar添加到这两个部分,并在两个部分中检查了"订单和导出",但它仍然无济于事.清洁和重建确实没有帮助.我错过了什么?

Nic*_*ick 8

答案在这里:http://archive.is/QzA8

换句话说,NativeActivity找不到第三方类而不是

jni_env->FindClass("com/flurry/android/FlurryAgent");
Run Code Online (Sandbox Code Playgroud)

一个人应该使用

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);
Run Code Online (Sandbox Code Playgroud)

  • `ClassLoader.loadClass()`的参数是一个"二进制名称",例如`java.lang.String`(参见JLS或`ClassLoader` javadoc).用'.'替换'/'的出现次数.在`NewStringUTF`调用中. (3认同)
  • @deko发布的更易读的版本:http://archive.is/QzA8 (2认同)