2011-08-07 2 views
5

네이티브 메서드를 구현해야합니다. "public native void someFunc();"라고 가정 해 봅시다. 두 개의 라이브러리 libabc.so와 libdef.so가 있습니다. Java는 System.loadLibrary()를 사용합니다. libabc.so (메소드를 구현하지 않음)를로드하지만 JNI 구현은 libdef.so에 있습니다. 현재 libabc.so에서 다음을 수행하고 있습니다.JNI를 사용하여 다른 JNI 라이브러리를로드 하시겠습니까?

JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved){ 
JNIEnv *env; 
jclass cls; 
jmethodID get_load_id; 
jstring name; 

jvm->GetEnv((void**)&env, JNI_VERSION_1_4); 
cls = env->FindClass("java/lang/System"); 
get_load_id = env->GetStaticMethodID(cls, "load", "(Ljava/lang/String;)V"); 
name = env->NewStringUTF("/lib/libdef.so"); 
env->CallStaticVoidMethod(cls, get_load_id, name); 

return JNI_VERSION_1_4; 
} 

그러나, 나는 (안드로이드 로그 캣에서) 오류를 받고 있어요 '나는 자바에서 직접 libdef.so로드하면, 내가 돈 "주는 JNI_OnLoad는 /lib/libdef.so 나쁜 버전 (-1) 반환" 이 오류가 발생하지 않습니다. 또한 다른 기본 메서드 인 "loadDef()"를 만들어 동일한 코드로 구현하면 작동합니다. 제 생각에는이 문제는 jvm-> GetEnv()를 사용하고 있지만 확실하지 않습니다. 또한, 이것이 내가 원하는 것을 성취 할 수 있는지 알지 못한다. (하나의 JNI 라이브러리를 사용하여 구현하기 위해 다른 라이브러리를로드한다.) 내가이 일을하는 이유는 복잡하지만 대안이 없다.

+0

아, 더 자세한 정보. logcat에서 오류가 발생하기 전에 "lib /lib/libdef.so 0x0을로드하려고 시도 중"이라고 생각합니다. 라이브러리를 0x0에로드하려고 시도하고 있음을 의미한다고 생각합니다. 왜 그런가요? – Yifan

+0

'loadLibrary()'가 재진입 적이라고 기대하는 것이 합리적이지는 않습니다. 이것이 정상적인 네이티브 메소드에서 작동한다는 사실은 그러한 의심을 품고있는 것으로 보입니다. 우리가 그 복잡한 이유를 가지고 우리를 시험 해보지 않으면 어쩌면 우리는 대안을 생각하는 데 도움을 줄 수 있습니다. –

+0

'RegisterNatives'를 시도해 볼 수는 있지만 라이브러리를 수동으로로드하고 함수의 위치를 ​​찾아야한다는 뜻입니다. loadLibrary()가 재진입 적이 아니고 문제가 발생한다면, 그렇게해야 할 수도 있습니다. – Yifan

답변

0

다른 JNI 라이브러리를 JNI_OnLoad에로드하는 문제에 대한 해결책이 아직 없지만이를 호출 한 첫 번째 네이티브 함수를 찾은 다음 해당 함수에서 loadLibrary 코드를 실행했습니다. 그런 다음 JNI에서 원시 메소드를 다시 호출하고 메소드의 새 버전을 실행합니다.

관련 문제