【发布时间】:2011-10-13 21:10:33
【问题描述】:
我正在尝试调用我使用 Android NDK 从 C 编写的一些 Java 代码。该应用程序是一个 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);
}
正如内联 cmets 所说,运行它会给我一个“java.lang.NoClassDefFoundError: [generic]”错误。当我解压缩我的 apk 时,它显示了 classes.dex 文件,其中似乎包含我的课程。我的猜测是,我在类路径方面缺少一些微妙之处,但到目前为止我无法解决它。
顺便说一句,我可以毫无问题地从 C 对标准 Android 库进行类似的调用(在上面的同一个 C 函数中)。具体来说,我测试了调用 Log.v,它可以正常工作并正确打印输出。
我发现的所有示例似乎都只显示了如何从 C 调用普通 Java 库,而不是您自己编写的 Java 库,所以我什至没有找到可以比较的示例项目。
【问题讨论】:
-
是的,我做到了。谢谢——事实证明,这是朝着正确的方向前进。完成后我会发布一个完整的解决方案。
标签: java android c java-native-interface android-ndk