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

时间:2016-05-26 12:30:26

标签: android android-studio android-ndk linker openssl

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

当我在命令行中运行“ndk-build”时,它会编译libcrypto.solibssl.so,我将其复制到项目的jnilibs/armeabi-v7ajniLibs/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依赖。

请有人帮助我弄清楚我的项目可能出现的问题。 提前谢谢!

1 个答案:

答案 0 :(得分:0)

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

像这样:

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

ldLibs += ["ssl"]