使用静态库的ndk android项目中出现未定义的引用错误



我正在android Studio中创建一个原生的android应用程序。我下载了GitHub eighthave/openssl android项目。我只将APP_ABI := armeabi-v7a行添加到jni/Application.mk作为它的第一行。

当我在命令行中运行"ndk-build"时,它会编译我复制到项目的jnilibs/armeabi-v7ajniLibs/armeabi-v7a文件夹中的libcrypto.solibssl.so。我还将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"时,它会在libs文件夹中创建一个sec.so文件,并复制旁边的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实验:0.7.0依赖性。

请有人帮我弄清楚我的项目可能出了什么问题。提前感谢!

我终于解决了我的问题。我似乎唯一错过的是build.gradle文件中的共享库链接。

像这样:

ldFlags += "-L${file(path/to/libssl.so)}".toString()
ldLibs += ["ssl"]

最新更新