2012-09-27 2 views
2

I read that JNI 함수 (네이티브 C 부분)는 매우 복잡하며 java 패키지 이름을 포함해야합니다.Android 웹킷 소스의 JNI 기능

그러나 Android 웹킷 소스를 읽을 때. WebView.cpp

static int nativeMoveGeneration(JNIEnv *env, jobject obj) 
{ 
    WebView* view = GET_NATIVE_VIEW(env, obj); 
    if (!view) 
     return 0; 
    return view->moveGeneration(); 
} 

Ihis JNI 함수의 WebView.java

private native int  nativeMoveGeneration(); 

그것은 JNI 함수를 호출의 예를 들어 nativeMoveGeneration 기능은 규칙의 이름을 지정 따르지 않습니다. 왜 그럴까요?

P/S : 위의 기능은 데모 용입니다. 나는 안드로이드 4.0.3 소스를 읽고 있어요, 그래서

UPDATE @ 알렉스 콘 덕분에이 JNI Tips 위의 github에 소스와 다를 수 있습니다, 우리가주는 JNI_OnLoad를 사용하거나 복잡한 이름을 사용할 수 있다는 것을 알고. 하지만 JNI_Onload를 어디에 두어야합니까?

답변

1

JNI는 특수 기능, JNI_OnLoad을 정의합니다. JNI 메소드가 불려 가기 전에 불려가 모든 C 함수의 포인터를 사용해 네이티브 메소드의 테이블을 생성 할 수 있습니다. the official document

+0

Android NDK 패키지의 모든 샘플을 읽었지만 JNI_OnLoad는 볼 수 없습니다. C 또는 C++ 소스간에 차이점이 있습니까? – onmyway133

+1

맞습니다. 사람들은 ** javah ** tool에서 제공하는 기본 바인딩을 선호합니다. ** JNI_OnLoad **의 사용이 정당화되는 경우는 거의 없습니다. 주로 전역 개체 초기화를 수행하는 데 도움이됩니다. 로드시에 멀티 스레딩 경쟁 조건이나 사용자 조치에 대한 즉각적인 응답에 대해 걱정할 필요가 없습니다. ** JNI_OnLoad **의 네이티브 메소드 테이블을 채우는 것에 관해서는, 매우 긴 테이블의 경우 약간의 성능 향상이있을 수 있습니다. WebKit에는 매핑 할 원시 메소드가 많이 있습니다. –

+1

JNI 검색을 사용하지 않는 또 다른 이유는 이제 메서드가 "정적"으로 선언 될 수 있으므로 이름이 장치의 기호 테이블에서 공백을 차지하지 않기 때문입니다. –