2010-08-02 14 views
2

Android의 JNI에 대한 통찰력을 추가하려면 도움이 필요합니다. 나는 안드로이드에서/libcore/x-net 패키지를보고 있었고 Apache Harmony가 SSL 기능을위한 기본 공급자 (OpenSSL 사용)임을 알아 냈습니다.Android JNI System.loadLibrary가 필요하지 않습니까?

내가 인터넷에서 발견 한 모든 곳에서 Android에서 JNI를 사용하면 System.loadLibrary (...) 메소드를 사용하여 원시 코드를로드해야하지만 Apache Harmony가이 코드를 사용하는 위치를 볼 수 없다고합니다. 조금도. 그들의 원시 코드가 어떻게로드되는지 혼란 스럽습니다. Java 코드에서 아무데도 자신의 기본 라이브러리를로드하지 않습니다.

/libcore/X-NET/SRC/메인/자바/조직 ... [JNI의 자바 코드]
/libcore/X-NET/SRC/주/기본/... [ JNI에 대한 C++ 코드]

크리스

+0

, 어디 당신이를 보았다 System.loadLibrary()로로드 된 코드에만 JNI가 작동한다고 설명되어 있습니까? 즉, dlopen()으로로드 된 코드 (System.loadLibrary()로로드 된 * 코드에서 dlopen()이 호출 됨)가 표시됩니다.이 코드는 내가 본 것으로 생각하는 것과 일치하지만, 그것이 짝수인지 의도적이며 문서화 됨 – tml

답변

5

Chrisc,

새로운 공급자를 추가 후속하려면, 당신은 어디서나 파일을 추가 할 수 있습니다 당신은 응용 프로그램 내 포함합니다. Android에는 여러 패키지가 이미 등록되어 있습니다. 예를 들어, 달빅에서/libcore/보안/SRC/메인/자바/자바/보안/Security.java

// Register default providers 
private static void registerDefaultProviders() { 
    secprops.put("security.provider.1", "org.apache.harmony.security.provider.cert.DRLCertFactory"); //$NON-NLS-1$ //$NON-NLS-2$ 
    secprops.put("security.provider.2", "org.apache.harmony.security.provider.crypto.CryptoProvider"); //$NON-NLS-1$ //$NON-NLS-2$ 
    secprops.put("security.provider.3", "org.apache.harmony.xnet.provider.jsse.JSSEProvider"); //$NON-NLS-1$ //$NON-NLS-2$ 
    secprops.put("security.provider.4", "org.bouncycastle.jce.provider.BouncyCastleProvider"); //$NON-NLS-1$ //$NON-NLS-2$ 
} 

또한 중복 libcore/보안/SRC/메인/자바/자바/보안/보안이다. 속성

그러나 동일한 패키지에 클래스를 추가하더라도 기존 공급자에는 영향을 미치지 않습니다. 이 경우 JSSEProvider와 같은 Provider 클래스가 다양한 알고리즘 구현을 제공하는 데 사용되는 클래스를 정의하기 때문입니다 (위의 내용을 참조하십시오)

경우에 따라 새 SSLContext 구현 . JSSEProvider에서 SSLContextImpl을 등록하여 SSLContext의 "TLS"(일명 SSL) 구현을 제공합니다. put ("SSLContext.TLS", SSLContextImpl.class.getName());

대체 구현을 등록하는 자체 공급자를 추가 할 수 있습니다.

Security.java 또는 security.properties에 공급자를 추가 할 필요는 없지만 Security.addProvider를 사용하여 새 값을 추가하거나 Security.insertProviderAt를 사용하여 공급자가 우선 순위에 따라 표시 될 위치를 제어 할 수 있습니다 .

자신의 공급자를 등록한 후에는 SSLContext.getInstance ("SSLContext", "your-provider-name")를 사용하여 새 공급자에서 인스턴스를 확보 할 수 있습니다. SSLContext.getInstance ("SSLContext")를 호출하는 모든 프로그램이 새로운 구현을 얻습니다.

SSLSocket 's는 SSLSocketFactory.getDefault()로 생성 할 수도 있습니다.SSLSocketFactory를 ssl.SocketFactory.provider = org.apache.harmony.xnet.provider.jsse.OpenSSLSocketFactoryImpl (SSLSocketFactory.getDefault 참조)와 함께 사용하려면 재정의 할 수 있습니다. 새 공급자를 추가하는 것과는 달리, 응용 프로그램 내에서이 작업을 수행 할 수 있는지 확신 할 수 없습니다.

마지막으로 C++ 코드까지 자신 만의 고유 한 JNI 코드를 제공 할 수 있습니다. 앱에서 그냥하고있는 경우 다른 JNI 코드처럼 등록 (또는 자동로드)하지만 대부분의 경우 기본 제공 코드로 작업하므로 이에 대한 자세한 내용은 알지 못합니다. 대부분의 네이티브 코드와 마찬가지로 현재 코드와 같이 VM에 코드를 작성하는 경우 심볼 이름 충돌을 피할 필요가 있습니다. 우리는 그러한 문제를 피하기 위해 파일에 정적으로 범위가 지정된 많은 코드를 작성하려고합니다. 그러나 libssl.so 자체의 다른 버전을 제공하는 것은 완전히 다른 문제입니다. 이런 식으로해야 할 일이 있다면 테스트 된 장치가 없습니다.

당신은 배경 새로운 공급자를 추가뿐만 아니라 유용이 후속 문서를 찾을 수 있습니다 : 어떻게 자바 (Java ™) 암호화의 공급자를 구현하는 아키텍처를 http://download-llnw.oracle.com/javase/6/docs/technotes/guides/security/crypto/HowToImplAProvider.html

BTW -bri

3
% arm-eabi-objdump -p .../symbols/system/lib/libdvm.so 
... 
Dynamic Section: 
    NEEDED    libnativehelper.so 

% cat dalvik/libnativehelper/Android.mk 
... 
static_libraries := \ 
    libjavacore \ 
    libfdlibm 

그것은이 VM 바이너리의 일부로 자동으로 뽑아. 네이티브 메소드는 명시 적으로 등록됩니다. dalvik/libnativehelper/Register.c를 참조하십시오.

라이브러리를 동적으로로드하면 SSL 구현과 같은 기능이 작동하지만 공유 라이브러리로드를 수행하려면 구현이 필요하므로 많은 핵심 클래스에서 문제가됩니다.

+0

감사합니다. 우연히 만났습니다. 오랫동안 그 문제를 조사해 왔습니다. 괜찮 으면, 내 문제에 대해 의견을 제시 할 수 있습니까? javax.net에 대한 새 공급자를 추가하려고합니다. .ssl 패키지 (현재는 org.apache.harmony.xnet.jsse).이 파일은 (/ libcore/x-net/src/main)에 있습니다. 자바와 C++ 파일은 어디에 두어야합니까? 기존 공급자가 여전히 올바르게 빌드 되었습니까? – Chrisc

+0

잘 모르겠습니다, 누군가에게 핑을 겁니다. – fadden

+0

그래, 고마워. 지금까지 내가 지금까지 어디에 배치했는지 설명하기 위해 "/ libcore/x-net/src/main/java/myjavapackage "(기존 공급자의 패키지와 함께)"/ libcore/x-net/src/native-cyassl "에 내 원시 코드의 폴더를 만들었습니다. sting provider의 네이티브 코드는 "libcore/x-net/src/native"에 있습니다. – Chrisc

관련 문제