免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7667 | 回复: 2
打印 上一主题 下一主题

[Android] 怎样在Android Native项目中使用OpenSSL? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-09-22 14:50 |只看该作者 |倒序浏览
本帖最后由 sugelawa 于 2013-09-22 14:51 编辑

我需要用到OpenSSL的RSA在项目中,我从OpenSSL1.0.1cForAndroid下载了源码然后成功编译得到libcrypto.so 和libssl.so。我将这两个文件拷贝到$(MY_PROJECT)/jni/lib/,然后在jni的Android.mk中这样引用:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_LIBS := $(LOCAL_PATH)/lib
LOCAL_STATIC_LIBRARIES := libcrypto libssl
LOCAL_LDLIBS := -llog
LOCAL_MODULE := jni

LOCAL_SRC_FILES := jni.c

include $(BUILD_SHARED_LIBRARY)


然后在代码中这样测试:

#include <stdio.h>
#include <string.h>

#include <openssl/rsa.h>

#define nr_bits 2048

int test_openssl()
{
  RSA *rsa = RSA_generate_key(nr_bits, 65537, NULL, NULL);
  return 0;
}


编译的时候报错:

....jni/test.c:10: error: undefined reference to 'RSA_generate_key'
collect2: ld returned 1 exit status


谁知道怎么回事吗?是link libcrypto.so的方式有问题吗还是怎么回事?

论坛徽章:
39
白银圣斗士
日期:2015-11-24 10:40:40酉鸡
日期:2015-03-20 14:15:44寅虎
日期:2015-03-20 14:13:59午马
日期:2015-03-20 14:13:16白羊座
日期:2015-03-20 14:12:54金牛座
日期:2015-03-20 14:12:09双子座
日期:2015-03-20 14:11:57巨蟹座
日期:2015-03-20 14:11:44狮子座
日期:2015-03-20 14:11:29亥猪
日期:2015-03-20 14:16:24戌狗
日期:2015-03-20 14:16:40申猴
日期:2015-03-20 14:17:05
2 [报告]
发表于 2013-09-22 17:32 |只看该作者
2个修改
1.修改mk文件
  1. LOCAL_PATH := $(call my-dir)

  2. include $(CLEAR_VARS)
  3. LOCAL_MODULE := crypto
  4. LOCAL_SRC_FILES := lib/libcrypto.so
  5. LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
  6. include $(PREBUILT_SHARED_LIBRARY)

  7. include $(CLEAR_VARS)
  8. LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
  9. LOCAL_LIBS := $(LOCAL_PATH)/lib
  10. LOCAL_STATIC_LIBRARIES := libcrypto libssl
  11. LOCAL_LDLIBS := -llog
  12. LOCAL_MODULE := jni

  13. LOCAL_SRC_FILES := jni.c

  14. include $(BUILD_SHARED_LIBRARY)
复制代码
2.修改openssl中的android-config.mk重新编译
#LOCAL_CFLAGS += -DOPENSSL_NO_DEPRECATED
这一行注释掉
查看rsa.h可以看到原因:
  1. /* Deprecated version */
  2. #ifndef OPENSSL_NO_DEPRECATED
  3. RSA *        RSA_generate_key(int bits, unsigned long e,void
  4.                 (*callback)(int,int,void *),void *cb_arg);
  5. #endif /* !defined(OPENSSL_NO_DEPRECATED) */

  6. /* New version */
  7. int        RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb);
复制代码
一测试通过.
如果不改2,你可以用new版本的RSA_generate_key_ex

论坛徽章:
0
3 [报告]
发表于 2013-09-22 23:07 |只看该作者
回复 2# rover12421 太厉害了,直接命中要害!3Q


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP