2016-12-28 1 views
0

안드로이드 앱을 만들기 위해 Qt (qml)를 사용하고 있지만 java에서 호출 할 원시 메소드를 등록하려고 할 때 오류가 발생합니다.qt android ClassNotFoundException

void NotificationClient::powerOff() { 
    QAndroidJniObject::callStaticMethod<void>("com/my_app/Utils", 
             "powerOff", 
             "()V" 
             ); 
} 

가 지금은 자바에서 다시 (this example 기준) 내 네이티브 코드에 어떤 통화를 추가하기 위해 노력하고있어하지만

실패 : 내 네이티브 코드의 한 부분에서 나는 아무런 문제없이 자바 정적 함수를 호출하고있어 에서
QAndroidJniEnvironment env; 
jclass objectClass = env->FindClass("com/my_app/Utils"); 

결과 :

Pending exception java.lang.ClassNotFoundException: Didn't find class "com.my_app.Utils" on path: DexPathList[[directory "."],nativeLibraryDirectories=[/system/lib, /vendor/lib, /system/lib, /vendor/lib]] 

나는 classes.dex와 클래스 문자열 경기에서 dexdump을 확인했습니다. 내 AndroidManifest.xml의 모든 경로는 절대 경로입니다. 나는 청소하고 재건했다. 그 문제를 해결하는 방법은 없으며 정적 메서드 호출이 작동하지만 객체 하나가 작동하지 않는 이유를 알 수 없습니다.

(예, 아직 다른 ClassNotFoundException 게시물이지만 실제로 이미 답변을 검색했습니다). 나는면 ClassNotFound 오류를

UPDATE OK를 제공에 FindClass를 사용하여 다시 전환 있도록 객체를 생성에 따라

편집 원래 실패 방법은 다른 오류가 발생했습니다, 그래서 내가 알아 낸 것 같아요 FindClass가 실패하는 이유 : this에 따라 FindClass는 호출 스택을 검색하여 사용할 ClassLoader를 찾습니다. 일반적으로 이것은 괜찮지 만 잘못된 클래스 로더가 호출되도록 다른 스레드에서 안드로이드로드에 대한 Qt를 믿습니다.

링크는 JNI_onLoad의 클래스를 캐싱 할 것을 권장하지만 배후에는 Qt가 있습니다. qt 스레드 대신 주 스레드에서 클래스 ID를 캐시 할 수있는 다른 곳이 있습니까?

+0

문제를 해결 했습니까? – BaCaRoZzo

+0

이 문제는 내 .cpp 파일 중 하나에 JNI_onLoad를 추가하고 거기에 클래스 ID를 찾는 것으로 끝났다 고 생각합니다. – ryan0270

+0

그래, 대부분 그 길입니다. 답변을 추가하거나 질문을 삭제하십시오. 감사. – BaCaRoZzo

답변

0

완전성에 대한 내 자신의 질문에 대답하기 위해 ...

는 클래스를 찾지 못했습니다 이유는 Qt를이 (자바 클래스 로더가 조회에 실패의 원인이 된 주요 자바 스레드가 아닌 다른 스레드에서 실행했다 문제의 링크를 참조하십시오).

솔루션으로 나는 클래스 탐색이 올바르게 작동 할 수 있도록 메인 자바 스레드에서 호출되는 내 cpp 파일 중 하나에 JNI_onLoad 함수를 추가했습니다.

관련 문제