android-对“ DTLS_client_method”的未定义引用

android-对“ DTLS_client_method”的未定义引用,第1张

概述我目前正在尝试在Android上实现DTLS,以便对UDP数据报进行加密.为此,我构建了openssl-android项目availablehere,由此获得了两个共享库libssl.so和libcrypto.so,我将其重命名为libsslx.so和libcryptox.so,以避免与android系统中包含的库混淆.然后,将这些文件(以及openssl标头文件

我目前正在尝试在Android上实现DTLS,以便对UDP数据报进行加密.
为此,我构建了openssl-androID项目available here,由此获得了两个共享库libssl.so和libcrypto.so,我将其重命名为libsslx.so和libcryptox.so,以避免与androID系统中包含的库混淆.

然后,将这些文件(以及openssl标头文件夹)放入具有以下结构的jni文件夹下的androID项目中:

jni->|->includes--->openssl--->header files     |     |->@R_30_3013@-|->libcryptox.so     |              |     |              |->libsslx.so     |     |->AndroID.mk     |     |->security.cpp

AndroID.mk文件的内容:

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODulE := sslxLOCAL_SRC_fileS := @R_30_3013@/libsslx.soLOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/includesinclude $(PREBUILT_SHARED_liBRARY)include $(CLEAR_VARS)LOCAL_MODulE := cryptoxLOCAL_SRC_fileS := @R_30_3013@/libcryptox.soLOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/includesinclude $(PREBUILT_SHARED_liBRARY)include $(CLEAR_VARS)LOCAL_MODulE    := securityLOCAL_SRC_fileS := security.cppLOCAL_SHARED_liBRARIES := sslx cryptoxinclude $(BUILD_SHARED_liBRARY)

security.cpp文件的内容

1 #include <jni.h>2 #include <string.h>3 #include <sys/types.h>4 #include <sys/socket.h>5 #include <netinet/in.h>6 #include <arpa/inet.h>7 extern "C" {8  #include "openssl/bio.h"9  #include "openssl/ssl.h"10 #include "openssl/err.h"11 struct sockaddr_in dst;12 static int const SOCKET_ERROR = 1000;13 static int const SOCKET_CREATED = 1100;14 static int const BIO_ERROR = 1200;15 static int const BIO_CREATED = 1300;16 static int const CTX_ERROR = 1400;17 static int const CTX_CREATED = 1500;18 static int const SSL_ERROR = 1600;19 static int const SSL_CREATED = 1700;20 voID Java_ch_gt_gcservjni_TestopenSSLJni_initopenSSL(jnienv *pEnv, jobject jObj){21      SSL_load_error_strings();22      ERR_load_BIO_strings();23          OpenSSL_add_all_algorithms();24 }25 jlong Java_ch_gt_gcservjni_TestopenSSLJni_startConnection(jnienv *pEnv, jobject jObj, Jstring jAddress, jint jPort){26    char *address;27      jclass clazz = pEnv->GetobjectClass(jObj);28      jmethodID mID = pEnv->getmethodID(clazz, "printMessage", "(I)V");29      if(mID == 0) return -1;30      address = 0;31      if (jAddress) {32          address = (char *)pEnv->GetStringUTFChars( jAddress, 0);33          if (!jAddress) return 0;34      }    //Socket creation/////////////////////////////////////////////////////////////////////////////35      int sock = 0;36      int port = (int)jPort;37      struct sockaddr_in addr;38      addr.sin_addr.s_addr = htonl(INADDR_ANY);39      addr.sin_port = htons(port);40      sock = socket(PF_INET, SOCK_DGRAM, 0);41      if(sock < 0){42          pEnv->CallVoIDMethod(jObj, mID, SOCKET_ERROR);43      }else{44          pEnv->CallVoIDMethod(jObj, mID, SOCKET_CREATED);45      }    ///////////////////////////////////////////////////////////////////////////////////////////////    //Basic IO functionalitIEs initialisation//////////////////////////////////////////////////////46      BIO* cnx = BIO_new_dgram(sock, BIO_NOCLOSE);47      if(cnx == NulL){48          pEnv->CallVoIDMethod(jObj, mID, BIO_ERROR);49      }else{50          pEnv->CallVoIDMethod(jObj, mID, BIO_CREATED);51      }    ///////////////////////////////////////////////////////////////////////////////////////////////52      struct sockaddr_in dst;53      struct sockaddr* d = (struct sockaddr*)&dst;54      dst.sin_family = AF_INET;55      dst.sin_port = htons(port);56      dst.sin_addr.s_addr = inet_addr(address);    //Set the BIO connection57      int err = BIO_dgram_set_peer(cnx, d);    //Initialisalisation of the Context///////////////////////////////////////////////////////////58      SSL_CTX *ctx = SSL_CTX_new(DTLSv1_clIEnt_method());59      if(ctx == NulL){60          pEnv->CallVoIDMethod(jObj, mID, CTX_ERROR);61      }62      else{63          pEnv->CallVoIDMethod(jObj, mID, CTX_CREATED);64      }65      SSL_CTX_set_read_ahead(ctx, 1);66      SSL_CTX_set_cipher_List(ctx, "HIGH:MEDIUM:aNull");67      SSL *ssl = SSL_new(ctx);68      if(ssl == NulL){69          pEnv->CallVoIDMethod(jObj, mID, SSL_ERROR);70      }71      else{72          pEnv->CallVoIDMethod(jObj, mID, SSL_CREATED);73      }74      SSL_set_bio(ssl, cnx, cnx);75      SSL_set_connect_state(ssl);76      return 0;77   }78 }

这就是问题所在,当我构建此代码时,所有功能都可以,除了最重要的一个功能是在第58行初始化上下文对象时的DTLSv1_clIEnt_method().

生成的错误是此错误:

/Applications/eclipse_bundle_mac/androID-ndk-r8d/toolchains/arm-linux-androIDeabi-      4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androIDeabi/4.6/../../../../arm-linux-androIDeabi/bin/ld: ./obj/local/armeabI/ObJs/security/security.o: in function Java_ch_gt_gcservjni_TestopenSSLJni_startConnection:jni/security.cpp:107: error: undefined reference to 'DTLSv1_clIEnt_method'

因此,似乎我的构建库中未引用该函数,我检查了我的头文件,DTLS函数在那里,我在openssl-androID项目的androID-config.mk文件中进行了检查,看是否未排除这些函数从buID结果中,我试图查看.so文件的内容没有成功,顺便说一句,我正在Mac OS X上工作.

有没有人有关于AndroID上DTLS的经验?对于这个问题,我将不胜感激.

编辑:我设法用arm-linux-androIDeabi-objdump工具获取了.so文件的内容,而没有任何DTLS函数的痕迹.它可能来自我所做的openssl构建过程,但是很奇怪,因为androID-config.mk中没有丢弃DTLS.

解决方法:

好的,只需选择一个用于构建openssl的项目并更改/ apps / ssl和/ crypto文件夹中位于.mk文件中的共享库名称即可解决此问题,以免造成混淆,如@L_419_2@中所述.

您可以在url下找到我使用的项目

总结

以上是内存溢出为你收集整理的android-对“ DTLS_client_method”的未定义引用全部内容,希望文章能够帮你解决android-对“ DTLS_client_method”的未定义引用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1093405.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存