Android NDK를 사용하여 C에서 작성한 Java 코드를 호출하려고합니다. 응용 프로그램은 NativeActivity 응용 프로그램입니다. Java에서만 사용할 수있는 일부 기능에 액세스해야하며 기능을 사용하려면 다른 클래스를 서브 클래스해야하므로 C에서 직접 호출 할 수는 없습니다. 따라서 다음과 같은 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);
}
}
오류 :이 나에게 "[일반] java.lang.NoClassDefFoundError가"를 제공 실행, 인라인 주석이 말한대로
// 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);
}
:
나는이 같은 C 코드가 있습니다. apk 패키지를 풀면 class.dex 파일이 표시됩니다. 클래스 파일에 클래스가있는 것 같습니다. 내 생각 엔 클래스 패스와 관련하여 누락 된 미묘한 점이 있지만 지금까지 해결할 수 없다.
덧붙여 말하자면 위의 동일한 C 함수에서 문제없이 C에서 표준 Android 라이브러리에 비슷한 호출을 할 수 있습니다. 특히, 나는 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