Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在android ndk中链接so文件_Android_C_Android Ndk - Fatal编程技术网

在android ndk中链接so文件

在android ndk中链接so文件,android,c,android-ndk,Android,C,Android Ndk,我正在尝试在android ndk中使用openssl 我使用了来自的openssl源代码,它能够生成libssl.so和libcrypto.so文件 目前我一直在用我的jni接口c文件链接这两个文件 下面是我的Android.mk文件,我的jni接口c文件名为“security.c” 这是我的security.c文件 #include <math.h> #include <stdio.h> #include <stdlib.h> #include <t

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

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

目前我一直在用我的jni接口c文件链接这两个文件

下面是我的Android.mk文件,我的jni接口c文件名为“security.c”

这是我的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");
}
#包括
#包括
#包括
#包括
#包括
#包括“openssl/bio.h”
#包括“openssl/ssl.h”
#包括“openssl/err.h”
jstring Java_com_test_stringFromJNI(JNIEnv*env,jobject thiz){
SSL_加载_错误_字符串();
ERR_load_BIO_strings();
OpenSSL_添加_所有算法();
return(*env)->NewStringUTF(env,“来自JNI的你好”);
}
使用ndk生成生成时,发生此错误

    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'
Android NDK:WARNING:APP_平台Android-19比Android:minSdkVersion 8 in/Users/huydo/cur project/company/kimisaki_native/Android_os/ensemble_girls/AndroidManifest.xml大
[armeabi-v7a]安装:libcrypto.so=>libs/armeabi-v7a/libcrypto.so
[armeabi-v7a]编译thumb:security libs/armeabi-v7a/libsecurity.so
[armeabi-v7a]安装:libssl.so=>libs/armeabi-v7a/libssl.so
[armeabi]安装:libcrypto.so=>libs/armeabi/libcrypto.so
[armeabi]编译thumb:security libs/armeabi/libsecurity.so
[armeabi]安装:libssl.so=>libs/armeabi/libssl.so
[x86]安装:libcrypto.so=>libs/x86/libcrypto.so
/Users/huydo/android-ndk-r9d/toolschains/x86-4.6/prebuild/darwin-x86_64/bin/i686-linux-android-strip:无法识别输入文件“%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]错误1
make:**正在删除文件`/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,这是行不通的

您需要使用针对正确体系结构的预构建。为此,您可以在libprebuild中根据每个体系结构(armeabi、armeabi-v7a、x86、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\u ABI:=armeabi-v7a x86 mips

您需要提供预构建的副本。因此,为您计划支持的每个体系结构预构建。@ChrisStratton:谢谢您的评论,您的意思是通过为mips和x86提供适当的标志来重新构建这些预构建(或者换句话说,我当前构建的libssl和libcrypto只支持arm,对吗)
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)