我正在Android Studio中创建一个原生的Android应用程序。我下载了GitHub eighthave/openssl-android项目。我只将行APP_ABI := armeabi-v7a
添加到jni/Application.mk
作为其第一行。
当我在命令行中运行“ndk-build”时,它会编译libcrypto.so
和libssl.so
,我将其复制到项目的jni
,libs/armeabi-v7a
和jniLibs/armeabi-v7a
文件夹。我还将include
文件夹复制到项目的jni
文件夹中。
我的项目Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libcrypto
LOCAL_SRC_FILES := libcrypto.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libssl
LOCAL_SRC_FILES := libssl.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := sec
LOCAL_SRC_FILES := main.cpp application.cpp
LOCAL_CPPFLAGS += -fexceptions -frtti -std=c++14
LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv1_CM
LOCAL_C_INCLUDES := ${ndkDir}/sources/android/native_app_glue
LOCAL_C_INCLUDES += $(LOCAL_PATH)/include # openssl include folder
LOCAL_SHARED_LIBRARIES := android_native_app_glue libcrypto libssl
include $(BUILD_SHARED_LIBRARY)
$(call import-module,android/native_app_glue)
当我在项目的命令行中运行“ndk-build”时,它会在sec.so
文件夹中创建一个libs
文件,并复制它旁边的OpenSSL共享库。
如果我尝试使用Android Studio创建apk,则会抛出错误:
undefined reference to 'DH_new'
在这一行:
DH dh = DH_new();
如果我不使用openssl项目中的任何函数,我只能在Android Studio中编译项目。如果我这样做,那么我可以在apk的“lib / armeabi-v7a”文件夹中看到所有共享库,这样它就可以找到所有库。
所以问题可能出在我的build.gradle
文件中,所以这里是:
apply plugin: 'com.android.model.application'
model {
android {
compileSdkVersion = 23
buildToolsVersion = "23.0.3"
defaultConfig {
applicationId = "com.example.sec"
minSdkVersion.apiLevel = 16
targetSdkVersion.apiLevel = 23
}
ndk {
moduleName = 'sec'
toolchain = 'clang'
stl = 'c++_static'
cppFlags.addAll(['-Wall', '-std=c++14', '-fexceptions'])
cppFlags.add("-I" + file("src/main/jni/include").absolutePath)
ldLibs.addAll(['log', 'android'])
}
sources {
main {
jni {
dependencies {
project ':nativeactivity' linkage 'static'
}
}
}
}
buildTypes {
release {
minifyEnabled = false
proguardFiles.add(file('proguard-rules.txt'))
}
}
productFlavors{
create("arm7") {
ndk.abiFilters.add("armeabi-v7a")
}
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.4.0'
}
这是我的Application.mk,但我认为它没有多大帮助:
APP_ABI := armeabi-v7a
APP_CPPFLAGS += -fexceptions -frtti -std=c++14
APP_STL := gnustl_static
我还尝试从OpenSSL项目创建静态库但仍然出错。我使用gradle-experimental:0.7.0依赖。
请有人帮助我弄清楚我的项目可能出现的问题。 提前谢谢!
答案 0 :(得分:0)
我终于解决了我的问题。 似乎我唯一遗漏的是链接build.gradle文件中的共享库。
像这样:
ldFlags += "-L${file(path/to/libssl.so)}".toString()
ldLibs += ["ssl"]