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