gpt4 book ai didi

android - 在android ndk中链接so文件

转载 作者:太空宇宙 更新时间:2023-11-04 03:45:25 24 4
gpt4 key购买 nike

我正在尝试在 android ndk 中使用 openssl。

我使用了来自 guardianproject github page 的 openssl 源代码,它能够生成 libssl.so 和 libcrypto.so 文件。

目前我无法将这 2 个文件与我的 jni 接口(interface) c 文件链接起来。

下面是我的Android.mk文件,我的jni接口(interface)c文件叫做“security.c”

LOCAL_PATH := $(call my-dir)

# Prebuilt libssl
include $(CLEAR_VARS)
LOCAL_MODULE := ssl
LOCAL_SRC_FILES := libprebuilt/libssl.so
include $(PREBUILT_SHARED_LIBRARY)

# Prebuilt libcrypto
include $(CLEAR_VARS)
LOCAL_MODULE := crypto
LOCAL_SRC_FILES := libprebuilt/libcrypto.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := security
LOCAL_SRC_FILES := security.c
LOCAL_SHARED_LIBRARIES= ssl crypto

include $(BUILD_SHARED_LIBRARY)

这是我的 security.c 文件

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <jni.h>
#include "openssl/bio.h"
#include "openssl/ssl.h"
#include "openssl/err.h"

jstring Java_com_test_stringFromJNI(JNIEnv* env, jobject thiz) {
SSL_load_error_strings();
ERR_load_BIO_strings();
OpenSSL_add_all_algorithms();
return (*env)->NewStringUTF(env, "Hello from JNI");
}

用ndk-build构建时,出现这个错误

    Android NDK: WARNING: APP_PLATFORM android-19 is larger than android:minSdkVersion 8 in /Users/huydo/cur-project/company/kimisaki_native/android_os/ensemble_girls/AndroidManifest.xml    
[armeabi-v7a] Install : libcrypto.so => libs/armeabi-v7a/libcrypto.so
[armeabi-v7a] Compile thumb : security <= security.c
[armeabi-v7a] SharedLibrary : libsecurity.so
[armeabi-v7a] Install : libsecurity.so => libs/armeabi-v7a/libsecurity.so
[armeabi-v7a] Install : libssl.so => libs/armeabi-v7a/libssl.so
[armeabi] Install : libcrypto.so => libs/armeabi/libcrypto.so
[armeabi] Compile thumb : security <= security.c
[armeabi] SharedLibrary : libsecurity.so
[armeabi] Install : libsecurity.so => libs/armeabi/libsecurity.so
[armeabi] Install : libssl.so => libs/armeabi/libssl.so
[x86] Install : libcrypto.so => libs/x86/libcrypto.so
/Users/huydo/android-ndk-r9d/toolchains/x86-4.6/prebuilt/darwin-x86_64/bin/i686-linux-android-strip: Unable to recognise the format of the input file `/Users/huydo/cur-project/XXX/android_os/YYY/libs/x86/libcrypto.so'
make: *** [/Users/huydo/cur-project/XXX/android_os/YYY/libs/x86/libcrypto.so] Error 1
make: *** Deleting file `/Users/huydo/cur-project/XXX/android_os/YYY/libs/x86/libcrypto.so'

注意到 libssl.so 和 libcrypto.so 已正确复制到 armeabi 和 armeabi-v7a 中。它在为 mips 和 x86 架构构建时卡住了。如果你以前遇到过这个错误,你能告诉我发生了什么事吗?

最佳答案

在针对每个体系结构进行编译时,您使用的是相同的 ARM libssl.so 和 libcrypto.so,这是行不通的。

您需要使用针对正确架构的预构建。为此,您可以在 libprebuilt 中创建针对每个架构命名的子文件夹(armeabiarmeabi-v7ax86、< em>mips),在每一个下面添加你的预构建 .so 文件,并在你的 Android.mk 中使用 $(TARGET_ARCH_ABI) 来引用你的 .so文件:

LOCAL_PATH := $(call my-dir)

# Prebuilt libssl
include $(CLEAR_VARS)
LOCAL_MODULE := ssl
LOCAL_SRC_FILES := libprebuilt/$(TARGET_ARCH_ABI)/libssl.so
include $(PREBUILT_SHARED_LIBRARY)

# Prebuilt libcrypto
include $(CLEAR_VARS)
LOCAL_MODULE := crypto
LOCAL_SRC_FILES := libprebuilt/$(TARGET_ARCH_ABI)/libcrypto.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := security
LOCAL_SRC_FILES := security.c
LOCAL_SHARED_LIBRARIES= ssl crypto

include $(BUILD_SHARED_LIBRARY)

如果您找不到 x86 版本的 libssl.so 和 libcrypto.so,您可以从 x86 模拟器中提取它们。

要指定您要编译项目的架构,请在 Application.mk 中使用 APP_ABI 变量,例如:APP_ABI := armeabi-v7a x86 mips

关于android - 在android ndk中链接so文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24948008/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com