我正试图使用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);
}
正如内联注释所述,运行此代码会给我一个"java.lang.NoClassDefFoundError: [generic]"错误。当我解压我的apk文件时,它显示了classes.dex文件,其中似乎有我的类。我猜测我错过了关于类路径方面的一些细微之处,但到目前为止我无法解决它。
顺便说一句,在同样的C函数中,我能够毫无问题地调用标准的Android库(例如Log.v),并且可以正确地打印输出。
看起来所有我找到的例子都只展示如何从C中调用标准的Java库,而不是自己编写的Java库,因此我甚至没有找到一个可以进行比较的示例项目。