代码之家  ›  专栏  ›  技术社区  ›  Nikolay Kulachenko

为Android构建Mailcore2

  •  4
  • Nikolay Kulachenko  · 技术社区  · 6 年前

    我遵循 official build instractions 重新编译库。就我而言:

    > export ANDROID_SDK=$HOME/Library/Android/sdk
    > export ANDROID_NDK=$ANDROID_SDK/ndk-bundle
    > ./build.sh
    

    在编译过程中会出现一些错误,如:

    [arm64-v8a] Compile++      : MailCore <= MCIMAPAsyncSession.cpp
    In file included from /Users/nikolay/Documents/Mailcore/mailcore2/build-android/jni/../include/MailCore/MCObject.h:11:0,
                     from /Users/nikolay/Documents/Mailcore/mailcore2/build-android/jni/../include/MailCore/MCAutoreleasePool.h:5,
                     from /Users/nikolay/Documents/Mailcore/mailcore2/build-android/jni/../include/MailCore/MCBaseTypes.h:5,
                     from /Users/nikolay/Documents/Mailcore/mailcore2/build-android/jni/../../src/async/imap/MCIMAPAsyncSession.h:13,
                     from /Users/nikolay/Documents/Mailcore/mailcore2/build-android/jni/../../src/async/imap/MCIMAPAsyncSession.cpp:9:
    /Users/nikolay/Documents/Mailcore/mailcore2/build-android/jni/../../src/async/imap/MCIMAPAsyncSession.cpp: In member function 'virtual void mailcore::IMAPAsyncSession::automaticConfigurationDone(mailcore::IMAPSession*)':
    /Users/nikolay/Documents/Mailcore/mailcore2/build-android/jni/../../src/async/imap/MCIMAPAsyncSession.cpp:874:87: warning: 'virtual mailcore::String* mailcore::IMAPSession::gmailUserDisplayName()' is deprecated (declared at /Users/nikolay/Documents/Mailcore/mailcore2/build-android/jni/../../src/core/imap/MCIMAPSession.h:196) [-Wdeprecated-declarations]
         MC_SAFE_REPLACE_COPY(String, mGmailUserDisplayName, session->gmailUserDisplayName());
                                                                                           ^
    /Users/nikolay/Documents/Mailcore/mailcore2/build-android/jni/../include/MailCore/MCUtils.h:8:27: note: in definition of macro 'MC_SAFE_COPY'
     #define MC_SAFE_COPY(o) ((o) != NULL ? (o)->copy() : NULL)
                               ^
    /Users/nikolay/Documents/Mailcore/mailcore2/build-android/jni/../../src/async/imap/MCIMAPAsyncSession.cpp:874:5: note: in expansion of macro 'MC_SAFE_REPLACE_COPY'
         MC_SAFE_REPLACE_COPY(String, mGmailUserDisplayName, session->gmailUserDisplayName());
         ^
    /Users/nikolay/Documents/Mailcore/mailcore2/build-android/jni/../../src/async/imap/MCIMAPAsyncSession.cpp:874:87: warning: 'virtual mailcore::String* mailcore::IMAPSession::gmailUserDisplayName()' is deprecated (declared at /Users/nikolay/Documents/Mailcore/mailcore2/build-android/jni/../../src/core/imap/MCIMAPSession.h:196) [-Wdeprecated-declarations]
         MC_SAFE_REPLACE_COPY(String, mGmailUserDisplayName, session->gmailUserDisplayName());
                                                                                           ^
    /Users/nikolay/Documents/Mailcore/mailcore2/build-android/jni/../include/MailCore/MCUtils.h:8:41: note: in definition of macro 'MC_SAFE_COPY'
     #define MC_SAFE_COPY(o) ((o) != NULL ? (o)->copy() : NULL)
                                             ^
    /Users/nikolay/Documents/Mailcore/mailcore2/build-android/jni/../../src/async/imap/MCIMAPAsyncSession.cpp:874:5: note: in expansion of macro 'MC_SAFE_REPLACE_COPY'
         MC_SAFE_REPLACE_COPY(String, mGmailUserDisplayName, session->gmailUserDisplayName());
         ^
    
    ... compiling goes ok...
    ... and again some errors...
    

    等等最后我得到:

    [arm64-v8a] StaticLibrary  : libstdc++.a
    [arm64-v8a] SharedLibrary  : libMailCore.so
    [arm64-v8a] Install        : libMailCore.so => libs/arm64-v8a/libMailCore.so
    warning: [options] bootstrap class path not set in conjunction with -source 1.6
    com/libmailcore/MainThreadUtils.java:3: error: package android.os does not exist
    import android.os.Handler;
                     ^
    com/libmailcore/MainThreadUtils.java:4: error: package android.os does not exist
    import android.os.Looper;
                     ^
    com/libmailcore/MainThreadUtils.java:5: error: package android.util does not exist
    import android.util.Log;
                       ^
    com/libmailcore/MainThreadUtils.java:10: error: cannot find symbol
        private Handler handler;
                ^
      symbol:   class Handler
      location: class MainThreadUtils
    com/libmailcore/MainThreadUtils.java:21: error: cannot find symbol
            handler = new Handler(Looper.getMainLooper());
                          ^
      symbol:   class Handler
      location: class MainThreadUtils
    com/libmailcore/MainThreadUtils.java:21: error: cannot find symbol
            handler = new Handler(Looper.getMainLooper());
                                  ^
      symbol:   variable Looper
      location: class MainThreadUtils
    6 errors
    1 warning
    

    如何重新编译库?最后我想修复一个 text relocations error 但它连一个干净的建筑都没有

    1 回复  |  直到 6 年前
        1
  •  3
  •   gregn3    4 年前

    它正在寻找Android平台16和21,但找不到它们,因此它会显示错误消息:

    error: package android.os does not exist
    

    这些通常安装在文件夹中 $ANDROID_SDK/platforms

    (将此添加到 build-android/build.sh ,查看它在做什么:

    set -v
    set -x
    

    这将显示它正在运行的命令以及shell变量的内容。)

    如果打开文件 构建android/构建。上海 ,在Mailcore2中,您将看到如下行:

    # Start building.
    ANDROID_PLATFORM=android-16
    archs="armeabi armeabi-v7a x86"
    

    代替 android-16 使用您安装的任何版本,甚至更好的版本,安装 android-16 因为它期待着。 还有 armeabi 最新的Android NDK中已经删除了对平台的支持,这给了我一些错误。所以删除 armeabi公司 只留下 armeabi-v7a x86

    下面还有:

    ANDROID_PLATFORM=android-21
    archs="arm64-v8a"
    

    以及:

    ANDROID_PLATFORM=android-16
    cd "$current_dir/../src/java"
    ...
    

    所以安装起来很简单 android-16 android-21 修复此问题。

    我也遇到了错误:

    Android NDK: APP_PLATFORM not set. Defaulting to minimum supported version android-16. 
    

    查找此行:

    $ANDROID_NDK/ndk-build TARGET_PLATFORM=$ANDROID_PLATFORM TARGET_ARCH_ABI=$TARGET_ARCH_ABI \
    

    和添加 APP_PLATFORM 这样,修复了该错误:

    $ANDROID_NDK/ndk-build TARGET_PLATFORM=$ANDROID_PLATFORM APP_PLATFORM=$ANDROID_PLATFORM TARGET_ARCH_ABI=$TARGET_ARCH_ABI \
    

    我也遇到了错误:

    *** Android NDK: Invalid NDK_TOOLCHAIN_VERSION value: 4.9. GCC is no longer supported. See https://android.googlesource.com/platform/ndk/+/master/docs/ClangMigration.md.    .  Stop.
    

    显然,GCC不再受支持。我已安装 叮当声 ,然后它继续编译项目,但由于另一个错误而停止。

    此外,我必须删除包含以下内容的行:

    NDK_TOOLCHAIN_VERSION=4.9 \
    

    如上所述 here

    我收到错误:

    MailCore2/build-android/jni/../../src/java/TypesUtils.cpp:84:32: error: member access into incomplete type 'const std::type_info'
    MCLog("info name: %s", info->name());
                               ^
    

    这显然与 this issue :

    GCC似乎只是隐式声明 std::type_info 。在使用Clang和libstdc++进行典型的Hello World时,通常第一次遇到此问题。Xeo 2013年2月26日20:42

    我还不能解决这个问题,但我会在有机会的时候更新这篇文章。