2011-12-16 30 views
0

我为Android构建了OpenSSL(使用ndk-build),并将其链接到我的程序。编译和链接工作,但我得到一个运行时错误UnsatisfiedLinkError。 更具体地说,在此代码的程序中断:无法为Android安装LoadLibrary ssl,越来越UnsatifiedLinkError

public class TestActivity extends Activity 
{  // load the library - name matches jni/Android.mk 
    static {  
     System.loadLibrary("crypto2"); 
     System.loadLibrary("ssl2"); // <=BREAKS HERE! 
     System.loadLibrary("Test"); 
     } 

它加载SSL2的时候,特意打破,所以现在看来​​,这是能够加载crypto2。 我想我需要告诉ssl2它使用cryto2,我试图在Android.mk文件上做到这一点,但它没有帮助。

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE := libcrypto2 
LOCAL_SRC_FILES := OpenSSL/libcrypto2.so 
include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := libssl2 
LOCAL_SRC_FILES := OpenSSL/libssl2.so 
LOCAL_SHARED_LIBRARIES := libcrypto2 
include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS) # Here we give our module name and source file(s) 
LOCAL_C_INCLUDES := D:/DevelopTools/OpenSSL-WIN32/include $(LOCAL_PATH)/../../../Framework/Applications/FW2Prototype $(LOCAL_PATH)/../../../Graphics/Libraries/Common $(LOCAL_PATH)/../../../Input/Libraries/Common $(LOCAL_PATH)/../../../Audio/Libraries/Common $(LOCAL_PATH)/../../../Audio/Libraries/NullAudio $(LOCAL_PATH)/../../../Network/Libraries/Common 
LOCAL_MODULE := Test 
LOCAL_SRC_FILES := Test.cpp Reference.cpp JNINetwork.cpp JNIGraphics2D.cpp JNIInput.cpp JNIAudio.cpp Applications/FatalWars2/FatalWars2.cpp /../../../Audio/Libraries/NullAudio/NullAudio.cpp 
LOCAL_SHARED_LIBRARIES := libcrypto2 libssl2 
include $(BUILD_SHARED_LIBRARY) 

任何想法是什么错?

谢谢,

+0

为什么不使用[javax.net.ssl](http://developer.android.com/reference/javax/net/ssl/package-summary.html)?它是内置的。 – kichik 2011-12-16 17:32:36

+0

这是可能的,但我认为现在使用本地选项会更容易,因为我已经实现并测试了代码。 – user1097185 2011-12-16 20:22:47

回答

0

我“解决了”这一点。 我简单地将openssl构建成单个文件。我静态地构建了crypto和ssl,所以ssl在crypto中的依赖被隐藏在静态链接中。 问题很明显,我无法加载预构建的共享库ssl,因为它依赖于另一个预先构建的共享库(crypto)。也许有可能以某种方式加载这样的库,但我的解决方案只是将静态链接加密到ssl中,然后加载到名为openssl的共享库中。