Android App Development include LDAP on MAC OS X
-
I compiled the framework with this script:
#!/bin/bash #adjust export NDK_LOCATION="/Users/user123/Library/Android/sdk" export ANDROID_NDK_HOME="$NDK_LOCATION/ndk-bundle" export CC="arm-linux-androideabi-gcc" export CXX="arm-linux-androideabi-g++" export RANLIB="arm-linux-androideabi-ranlib" export LD="arm-linux-androideabi-ld" export AR="arm-linux-androideabi-ar" export CROSS_COMPILE="arm-linux-androideabi" #define android api export ANDROID_API=16 export CFLAGS="-D__ANDROID_API__=$ANDROID_API" #install toolchain ${ANDROID_NDK_HOME}/build/tools/make-standalone-toolchain.sh --platform=android-${ANDROID_API} --install-dir=${ANDROID_NDK_HOME}/android-toolchain export PATH="$PATH:$ANDROID_NDK_HOME/android-toolchain/bin" export LIB_DIR="`pwd`/lib" export LDAP_OUTPUT_DIR="${LIB_DIR}/compiled/OpenLDAP" #download lib #git clone https://github.com/openldap/openldap.git cd "$LIB_DIR/openldap" ./configure --host=${CROSS_COMPILE} --prefix="${LDAP_OUTPUT_DIR}" --with-yielding_select=yes make depend make && make install
And tried to add it in my pro file:
# ekke (Ekkehard Gentz) @ekkescorner TEMPLATE = app TARGET = stacked_pages_x QT += qml quick core sql CONFIG += c++11 INCLUDEPATH += lib/compiled/OpenLDAP/include LIBS += -L lib/compiled/OpenLDAP/lib -lldap ANDROID_EXTRA_LIBS += lib/compiled/OpenLDAP/lib/libldap.so HEADERS += \ handlenewstudent.h \ applicationui.hpp \ uiconstants.hpp \ entities/admin.h \ dbhelper.h \ entities/student.h \ handletextfield.h \ lists/studentlist.h \ entities/studentlistmodel.h\ ldapAuth.h SOURCES += main.cpp \ applicationui.cpp \ entities/admin.cpp \ dbhelper.cpp \ entities/student.cpp \ handletextfield.cpp \ lists/studentlist.cpp \ entities/studentlistmodel.cpp\ ldapAuth.cpp \ handlenewstudent.cpp lupdate_only { SOURCES += main.qml \ common/*.qml \ pages/*.qml } OTHER_FILES += images/black/*.png \ images/black/x18/*.png \ images/black/x36/*.png \ images/black/x48/*.png \ images/white/*.png \ images/white/x18/*.png \ images/white/x36/*.png \ images/white/x48/*.png \ translations/*.* \ images/LICENSE \ LICENSE \ *.md RESOURCES += \ translations.qrc \ qml.qrc \ images.qrc # Additional import path used to resolve QML modules in Qt Creator's code model QML_IMPORT_PATH = # Default rules for deployment. include(deployment.pri) # T R A N S L A T I O N S # if languages are added: # 1. rebuild project to generate *.qm # 2. add existing .qm files to translations.qrc # if changes to translatable strings: # 1. Run Tools-External-Linguist-Update # 2. Run Linguist and do translations # 3. Build and run on iOS and Android to verify translations # 4. Optional: if translations not done: Run Tools-External-Linguist-Release # Supported languages LANGUAGES = de en # used to create .ts files defineReplace(prependAll) { for(a,$$1):result += $$2$${a}$$3 return($$result) } # Available translations tsroot = $$join(TARGET,,,.ts) tstarget = $$join(TARGET,,,_) TRANSLATIONS = $$PWD/translations/$$tsroot TRANSLATIONS += $$prependAll(LANGUAGES, $$PWD/translations/$$tstarget, .ts) # run LRELEASE to generate the qm files qtPrepareTool(LRELEASE, lrelease) for(tsfile, TRANSLATIONS) { command = $$LRELEASE $$tsfile system($$command)|error("Failed to run: $$command") } DISTFILES += \ pages/PageStudentNew.qml \ pages/PageItemOverview.qml \ pages/PageItemNew.qml \ pages/PageHome.qml \ pages/PageUserOverview.qml \ pages/PageUserNew.qml \ pages/PageBorrowedItemsOverview.qml \ pages/PageBorrowItem.qml \ pages/PageGiveBackItem.qml \ pages/PageLogin.qml
But it still don't work, it throws errors that functions are not in the declared scope
/Edit: solved it, I used deprecated functionality of the library that can be enabled over the macro LDAP_DEPRECATED
-
@mkmp29 said in Android App Development include LDAP on MAC OS X:
But it still don't work, it throws errors that functions are not in the declared scope
What errors and where?
This line looks fishy to me:
--host=${CROSS_COMPILE}
The host is your host machine (your Mac), so it should rather be something like x86_64, and not the ARM architecture. But maybe LDAP is using some other convention, I don't know.
-
My error is:
:-1: error: error: cannot find -lldap
I think there is mistake in the .pro file:
The Filestructure is:
- *.pro - lib - compiled - OpenLDAP - lib - include - * - other files
in the lib directory are these files:
liblber-2-devel.so.0 libldap.la liblber-2-devel.so.0.0.0 libldap.so liblber.a libldap_r-2-devel.so.0 liblber.la libldap_r-2-devel.so.0.0.0 liblber.so libldap_r.a libldap-2-devel.so.0 libldap_r.la libldap-2-devel.so.0.0.0 libldap_r.so libldap.a
-
@mkmp29 said in Android App Development include LDAP on MAC OS X:
-L lib/compiled/OpenLDAP/lib -lldap
There should be no space between '-L' and your library search path.
-
@mkmp29 said in Android App Development include LDAP on MAC OS X:
INCLUDEPATH += lib/compiled/OpenLDAP/include
LIBS += -L lib/compiled/OpenLDAP/lib -lldap
ANDROID_EXTRA_LIBS += lib/compiled/OpenLDAP/lib/libldap.soDidn't work either. I just get the message for multiple lib function:
ldapAuth.o:ldapAuth.cpp:function LDAPAuth::~LDAPAuth(): error: undefined reference to 'ldap_unbind' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::~LDAPAuth(): error: undefined reference to 'ldap_unbind' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::checkStatus(QString const&, int): error: undefined reference to 'ldap_err2string' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::checkStatus(QString const&, int): error: undefined reference to 'ldap_err2string' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::init(): error: undefined reference to 'ldap_initialize' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::init(): error: undefined reference to 'ldap_initialize' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::init(): error: undefined reference to 'ldap_set_option' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::init(): error: undefined reference to 'ldap_set_option' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::init(): error: undefined reference to 'ldap_start_tls_s' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::init(): error: undefined reference to 'ldap_start_tls_s' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::init(): error: undefined reference to 'ldap_simple_bind_s' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::search(QString const&): error: undefined reference to 'ldap_search_ext_s' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::search(QString const&): error: undefined reference to 'ldap_first_entry' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::search(QString const&): error: undefined reference to 'ldap_get_dn' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::search(QString const&): error: undefined reference to 'ldap_first_attribute' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::search(QString const&): error: undefined reference to 'ldap_get_values' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::search(QString const&): error: undefined reference to 'ldap_next_attribute' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::search(QString const&): error: undefined reference to 'ldap_memfree' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::search(QString const&): error: undefined reference to 'ldap_next_entry' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::search(QString const&): error: undefined reference to 'ldap_msgfree' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::search(QString const&): error: undefined reference to 'ldap_msgfree' ldapAuth.o:ldapAuth.cpp:function LDAPAuth::authentificate(QString const&, QString const&): error: undefined reference to 'ldap_simple_bind_s' collect2: error: ld returned 1 exit status
Looks like the library is compiled wrong ?
-
Hi,
Did you check the x86 vs x86_64 architecture for your library ?
-
No there's not.
The only alternative is to check whether your targets already have them available in their root filesystem and re-use them.
-
I can compile the application and push it to the virtual device. But i get the error:
W System.err: Caused by: java.lang.UnsatisfiedLinkError: dlopen failed: library "liblber-2-devel.so.0" not found
This file is contained in the lib folder of my cross compiled library. I read a little bit and tried to load the library during runtime with the QT Object: QLibrary and the function load. But it didnt work.
this is the part of my .pro file
ANDROID_EXTRA_LIBS += $$PWD/lib/compiled/openldap-i686-linux-android_16/lib/libldap.so ANDROID_EXTRA_LIBS += $$PWD/lib/compiled/openldap-i686-linux-android_16/lib/liblber.so ANDROID_EXTRA_LIBS += $$PWD/lib/compiled/openldap-i686-linux-android_16/lib/libldap_r.so #ANDROID_EXTRA_LIBS += $$PWD/lib/compiled/openldap-i686-linux-android_16/lib/liblber-2-devel.so.0 #ANDROID_EXTRA_LIBS += $$PWD/lib/compiled/openldap-i686-linux-android_16/lib/liblber-2-devel.so.0.0.0 #ANDROID_EXTRA_LIBS += $$PWD/lib/compiled/openldap-i686-linux-android_16/lib/libldap-2-devel.so.0 #ANDROID_EXTRA_LIBS += $$PWD/lib/compiled/openldap-i686-linux-android_16/lib/libldap-2-devel.so.0.0.0 #ANDROID_EXTRA_LIBS += $$PWD/lib/compiled/openldap-i686-linux-android_16/lib/libldap_r-2-devel.so.0 #ANDROID_EXTRA_LIBS += $$PWD/lib/compiled/openldap-i686-linux-android_16/lib/libldap_r-2-devel.so.0.0.0 LIBS += -L$$PWD/lib/compiled/openldap-i686-linux-android_16/lib/ -lldap INCLUDEPATH += $$PWD/lib/compiled/openldap-i686-linux-android_16/include DEPENDPATH += $$PWD/lib/compiled/openldap-i686-linux-android_16/include PRE_TARGETDEPS += $$PWD/lib/compiled/openldap-i686-linux-android_16/lib/libldap.a LIBS += -L$$PWD/lib/compiled/openldap-i686-linux-android_16/lib/ -llber INCLUDEPATH += $$PWD/lib/compiled/openldap-i686-linux-android_16/include DEPENDPATH += $$PWD/lib/compiled/openldap-i686-linux-android_16/include PRE_TARGETDEPS += $$PWD/lib/compiled/openldap-i686-linux-android_16/lib/liblber.a LIBS += -L$$PWD/lib/compiled/openldap-i686-linux-android_16/lib/ -lldap_r INCLUDEPATH += $$PWD/lib/compiled/openldap-i686-linux-android_16/include DEPENDPATH += $$PWD/lib/compiled/openldap-i686-linux-android_16/include PRE_TARGETDEPS += $$PWD/lib/compiled/openldap-i686-linux-android_16/lib/libldap_r.a
Library loading at the beginning of the main method.
QLibrary ldap("ldap"); QLibrary ldap_r("ldap_r"); QLibrary lber("lber"); if(!ldap.load() || !lber.load() || !ldap_r.load()){ qDebug() << "Failed loading library"; }
The libraries that are contained in the lib folder are listed above
-
IIRC, android doesn't support library versioning so ensure that you don't have a symbolic link copied to your package but a copy of the library.
-
@SGaist said in Android App Development include LDAP on MAC OS X:
IIRC, android doesn't support library versioning so ensure that you don't have a symbolic link copied to your package but a copy of the library.
I removed the links from the libraries, deleted the links and renamed the lib to its original name, but the error still appears...
-
Which one ? The missing symbol or the dlopen error ?
-
Why are you dlopening the library on Android rather than linking to it ?
-
@mkmp29 said in Android App Development include LDAP on MAC OS X:
this does the the library...
Can you rephrase that please ? I don't understand what it means at all.
-
@SGaist said in Android App Development include LDAP on MAC OS X:
@mkmp29 said in Android App Development include LDAP on MAC OS X:
this does the the library...
Can you rephrase that please ? I don't understand what it means at all.
If I get it right, he means that he links the LDAP library. That library, however, uses dlopen internally to access yet another library.