Ich erstelle eine native Android-Anwendung in Android Studio. Ich habe GitHub eighthave/openssl-android Projekt heruntergeladen. Ich fügte nur die Reihe APP_ABI := armeabi-v7a
zu jni/Application.mk
als seine erste Reihe hinzu.undefined Referenzfehler in ndk Android-Projekt mit statischen Bibliothek
Als ich „NDK-build“ in der Kommandozeile ausführen es libcrypto.so
und libssl.so
kompiliert, die ich jni
, libs/armeabi-v7a
und jniLibs/armeabi-v7a
Ordner mein Projekt kopiert. Ich kopierte auch den Ordner include
in den Ordner jni
meines Projekts.
Mein Projekt 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)
Als ich „NDK-build“ von der Kommandozeile auf mein Projekt erstellt es eine sec.so
Datei im libs
Ordner und kopiert die OpenSSL-Bibliotheken neben ihm geteilt laufen.
Wenn ich versuche, eine apk mit Android Studio zu erstellen wirft er einen Fehler:
undefined reference to 'DH_new'
in dieser Reihe:
DH dh = DH_new();
ich das Projekt nur in Android Studio kompilieren kann, wenn ich nicht tun Verwenden Sie beliebige Funktionen aus dem openssl-Projekt. Und wenn ich das tue, dann kann ich alle geteilten Bibliotheken im apk-Ordner "lib/armeabi-v7a" sehen, so dass sie alle Bibliotheken finden kann.
So wohl das Problem so hier in meiner build.gradle
Datei könnte es ist:
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'
}
Und hier ist Application.mk meines, aber ich glaube nicht, es hilft viel:
APP_ABI := armeabi-v7a
APP_CPPFLAGS += -fexceptions -frtti -std=c++14
APP_STL := gnustl_static
I versuchte auch, statische Bibliotheken aus OpenSSL-Projekt zu erstellen, aber immer noch Fehler. Ich benutze gradle-experimental: 0.7.0 Abhängigkeit.
Kann mir bitte jemand helfen, es herauszufinden, was mit meinem Projekt falsch sein könnte. Vielen Dank im Voraus!
Sie können OpenSSL nicht direkt als gemeinsames Objekt verwenden. Sie müssen ein gemeinsames Wrapper-Objekt schreiben, das alle gewünschten OpenSSL-Funktionen verfügbar macht. Ihr Wrapper-Objekt wird mit der statischen Version von OpenSSL verknüpft. Weitere Informationen finden Sie unter [Ändern der OpenSSL-Bibliothek in der Android-App für HttpClient] (http://stackoverflow.com/q/28341215). Sie haben möglicherweise Linkprobleme, wenn Sie das gemeinsame Wrapper-Objekt mit der statischen Version von OpenSSL verknüpfen, aber das ist ein anderes Problem. – jww
Danke für die Information. Ich werde mir das merken. –