【问题标题】:Android NDK - Android studio gradle undefined reference to __android_log_writeAndroid NDK - Android studio gradle 未定义对 __android_log_write 的引用
【发布时间】:2014-12-21 18:15:54
【问题描述】:

我试图通过插入日志消息来调试 JNI C 函数,但我无法让它工作。首先,我只是想修改 Android Studio 附带的 hello-jni 示例。这是修改后的代码:

#include <string.h>
#include <jni.h>
#include <android/log.h>

jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                              jobject thiz )
{
#if defined(__arm__)
    #if defined(__ARM_ARCH_7A__)
    #if defined(__ARM_NEON__)
      #if defined(__ARM_PCS_VFP)
        #define ABI "armeabi-v7a/NEON (hard-float)"
      #else
        #define ABI "armeabi-v7a/NEON"
      #endif
    #else
      #if defined(__ARM_PCS_VFP)
        #define ABI "armeabi-v7a (hard-float)"
      #else
        #define ABI "armeabi-v7a"
      #endif
    #endif
  #else
   #define ABI "armeabi"
  #endif
#elif defined(__i386__)
   #define ABI "x86"
#elif defined(__x86_64__)
   #define ABI "x86_64"
#elif defined(__mips64)  /* mips64el-* toolchain defines __mips__ too */
   #define ABI "mips64"
#elif defined(__mips__)
   #define ABI "mips"
#elif defined(__aarch64__)
   #define ABI "arm64-v8a"
#else
   #define ABI "unknown"
#endif

    __android_log_write(ANDROID_LOG_ERROR, "TEST_TAG", "Error here");

    return (*env)->NewStringUTF(env, "Hello from JNI !  Compiled with ABI " ABI ".");
}

这是我的 Android.mk 文件:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := hello-jni.c
LOCAL_LDFLAGS := -llog

include $(BUILD_SHARED_LIBRARY)

当我使用 ndk-build 脚本时,构建 libhello-jni.so 文件没有问题。当我尝试在 Android Studio 中构建项目时,我收到以下 gradle 错误消息

Information:Gradle tasks [:app:assembleDebug]
:app:preBuild
:app:compileDebugNdk
C:\Android\projects\hello-jni\app\build\intermediates\ndk\debug\obj/local/arm64-v8a/objs/hello-jni/C_\Android\projects\hello-jni\app\src\main\jni\hello-jni.o: In function `Java_com_example_hellojni_HelloJni_stringFromJNI':
hello-jni.c:(.text.Java_com_example_hellojni_HelloJni_stringFromJNI+0x24): undefined reference to `__android_log_write'
Error:error: ld returned 1 exit status
make.exe: *** [C:\Android\projects\hello-jni\app\build\intermediates\ndk\debug\obj/local/arm64-v8a/libhello-jni.so] Error 1
Error:Execution failed for task ':app:compileDebugNdk'.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
C:\Android\android-ndk-r10c\ndk-build.cmd NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=C:\Android\projects\hello-jni\app\build\intermediates\ndk\debug\Android.mk APP_PLATFORM=android-19 NDK_OUT=C:\Android\projects\hello-jni\app\build\intermediates\ndk\debug\obj NDK_LIBS_OUT=C:\Android\projects\hello-jni\app\build\intermediates\ndk\debug\lib APP_ABI=all
Error Code:
2
Output:
C:\Android\projects\hello-jni\app\build\intermediates\ndk\debug\obj/local/arm64-v8a/objs/hello-jni/C_\Android\projects\hello-jni\app\src\main\jni\hello-jni.o: In function `Java_com_example_hellojni_HelloJni_stringFromJNI':
hello-jni.c:(.text.Java_com_example_hellojni_HelloJni_stringFromJNI+0x24): undefined reference to `__android_log_write'
collect2.exe: error: ld returned 1 exit status
make.exe: *** [C:\Android\projects\hello-jni\app\build\intermediates\ndk\debug\obj/local/arm64-v8a/libhello-jni.so] Error 1
Information:BUILD FAILED
Information:Total time: 3.297 secs
Information:2 errors
Information:0 warnings
Information:See complete output in console

我已经尝试了这个问题中给出的建议,但我仍然得到同样的错误:What is the Log API to call from an Android JNI program?

我做错了什么?

我正在使用 Android Studio 0.8.9 和 NDK r10c。

【问题讨论】:

  • 似乎-llog 标志没有通过。你的 GCC 链接命令是什么样的?
  • 我在哪里可以找到?
  • 如果 log.h 中的 ALOG* 定义,为什么要使用私有函数?
  • 我不知道 log.h 中有 ALOG* 定义。我以为你必须自己定义它们。

标签: android-studio gradle android-ndk linker-errors android.mk


【解决方案1】:

经过一番搜索,我找到了答案。

如果我在命令行上使用 ndk-build 脚本构建 .so 文件并添加

sourceSets.main {
    jni.srcDirs = []
    jniLibs.srcDir 'src/main/libs'
}

到我的 build.gradle 文件中,因此 gradle 不会尝试构建 .so 文件,然后一切正常。 Android Studio-Gradle-NDK 集成似乎有问题?

我在这里找到了答案https://stackoverflow.com/a/21111458/4182796

【讨论】:

    【解决方案2】:

    丑陋的解决方法是删除函数调用并重建源代码,只需在包含后添加:

    #if 1
    #undef __android_log_print
    #define __android_log_print(...) {}
    #endif
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-18
      • 2018-02-24
      • 2019-03-08
      • 2017-01-12
      • 1970-01-01
      • 1970-01-01
      • 2017-04-12
      • 1970-01-01
      相关资源
      最近更新 更多