2014-06-26 27 views
1

我正在使用C++庫。它與openss-1.0.1h庫(即libssl.so,libcrypto.so)和openssl庫是動態鏈接的。問題是當我嘗試使用我的android應用程序加載庫時,應用程序崩潰。而在日誌中的貓,我可以看到的東西的原因這樣的 - 我沒有叫的System.loadLibrary()加載C++ jni庫時應用程序崩潰動態鏈接openss-1.0.1h

「無法找到libABC.so需要libssl.so.1.0.0」

OpenSSL的庫,我只爲我的C++庫調用。

當我使用openssl-1.0.0的動態鏈接或openssl-1.0.1h的靜態鏈接時,此問題從不起作用。

我不知道如何解決這個問題。任何人都可以幫我解決這個問題嗎?

我沒下加載庫 -

System.loadLibrary("ssl"); 
System.loadLibrary("crypto"); 
System.loadLibrary("ABC"); 
+0

因此,請爲System.loadlibrary調用libssl。這就是你應該做的。 – nneonneo

+0

但之前我從來沒有爲libssl調用System.loadlibrary,它與openssl-1.0.0一起工作 –

+1

可能運氣不佳,系統可能會預裝libssl。您應該使用System.load庫手動加載任何依賴項。 – nneonneo

回答

2

看起來你有兩個問題。首先是與OpenSSL鏈接;其次是在APK中查找庫。


我使用的是C++庫,它是動態與openss-1.0.1^h庫鏈接...

這是你的第一個問題。 Android的相當於init的是zygote。 Zygote加載平臺的OpenSSL版本。當Zygote叉開始您的應用程序時,您的應用程序將獲得已經鏈接的OpenSSL版本,可能爲0.9.8。由於您的應用程序是針對1.0.1構建的,因此您將在運行時崩潰,因爲0.9.8和1.0.0是而不是二進制兼容。

要解決此問題,您必須構建一個包裝器共享對象,該對象與OpenSSL庫的靜態版本的鏈接。然後,當您需要進行OpenSSL調用時,您可以通過包裝器進行公開。例如,你可能有一個GetSslContext換到OpenSSL的SSLv23_methodSSL_CTX_newSSL_CTX_set_options來電等

這避免調用到受精卵的下級OpenSSL的。它也記錄在OpenSSL wiki上OpenSSL and Android


「無法找到libABC.so需要libssl.so.1.0.0」

這是你的第二個問題。首先,如上所述創建一個包裝器共享對象。其次,將共享對象放在適當的目錄中。共享包裝應放置在lib/目錄中。我相信你也可以在子目錄中擁有專門的庫版本。例如,lib/將是一個通用回退,而lib/armv7-a/將是專爲ARMv7a構建的共享對象。

您可以在運行時庫與ApplicationInfo類及其nativeLibDir方法:

public String nativeLibraryDir 

    Full path to the directory where native JNI libraries are stored. 

也看到Android的JNI Tips和機庫部分。


System.loadLibrary("ssl"); 
System.loadLibrary("crypto"); 

相關,libssl取決於libcrypto,所以它應該是:

static { 
    System.loadLibrary("crypto"); 
    System.loadLibrary("ssl"); 
} 

但你可能要避免它,並使用包裝共享對象。

+1

你可以請參閱我的鏈接,我可以找到足夠的引用來創建openssl的包裝? –

+1

@naseef - 以下是我在學習時使用的內容:[Android Native Development Kit Cookbook](http://www.amazon.com/dp/1849691509)。您可以從Packet Publishing在線找到示例章節。幸運的是,它們提供了第8章和第9章,這是你需要的章節。 – jww

+0

非常感謝你:) –