我想調用一些我使用Android NDK從C編寫的Java代碼。該應用程序是一個NativeActivity應用程序。我必須訪問一些僅在Java中可用的功能,並且功能需要您繼承另一個類,所以我不能直接從C中調用。因此,我有這樣的Java代碼:如何在Android上以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文件,該文件似乎有我的課程。我的猜測是,我對類路徑缺少一些微妙之處,但到目前爲止我無法解決它。
順便說一句,我能夠做出從C標準的Android庫類似的調用沒有問題(在相同的C函數以上)。具體來說,我測試了調用Log.v並且正常工作並打印輸出。
看來,我只有找到所有示例顯示如何調用正常的Java庫從C,你寫你自己沒有Java庫,所以我還沒有找到一個示例項目來比較。
你讀過這個嗎? http://developer.android.com/guide/practices/design/jni.html#faq_FindClass – Klaimmore
是的,我做到了。謝謝 - 這是正確的方向,事實證明。完成後我會發佈一個完整的解決方案。 – itfische
請看看這個:http://groups.google.com/group/android-developers/browse_thread/thread/e090b94fe958ab31 – Wei