2016-05-26 9 views
0

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!

+0

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

+0

Danke für die Information. Ich werde mir das merken. –

Antwort

0

Ich habe endlich mein Problem gelöst. Es scheint, dass das einzige, was ich verpasste, Link zu den gemeinsam genutzten Bibliotheken in der Build.Gradle-Datei ist.

So:

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

ldLibs += ["ssl"] 
+0

Ich verstehe es nicht. Ich sehe keine ldFlags, die in den größenexperimentellen Spezifikationen erwähnt sind. –