2016-11-28 2 views
5

Я использую Android Studio 2.2 и cmake для создания jni-файла.Android ndk (cmake): 'undefined reference to `__android_log_write' при использовании log api во второй библиотеке jni

Я хочу показать журнал jni-файла, но получить сообщение об ошибке «неопределенная ссылка на` __android_log_write ».

Мой файл CMakeLists.txt является:

add_library(# Sets the name of the library. 
     native-lib 

     # Sets the library as a shared library. 
     SHARED 

     # Provides a relative path to your source file(s). 
     # Associated headers in the same location as their source 
     # file are automatically included. 
     src/main/cpp/native-lib.cpp) 

add_library(# Sets the name of the library. 
     test-lib 

     # Sets the library as a shared library. 
     SHARED 

     # Provides a relative path to your source file(s). 
     # Associated headers in the same location as their source 
     # file are automatically included. 
     src/main/cpp/test-lib.cpp) 

include_directories(src/main/jni/) 

# Searches for a specified prebuilt library and stores the path as a 
# variable. Because system libraries are included in the search path by 
# default, you only need to specify the name of the public NDK library 
# you want to add. CMake verifies that the library exists before 
# completing its build. 

find_library(# Sets the name of the path variable. 
      log-lib 

      # Specifies the name of the NDK library that 
      # you want CMake to locate. 
      log) 

# Specifies libraries CMake should link to your target library. You 
# can link multiple libraries, such as libraries you define in the 
# build script, prebuilt third-party libraries, or system libraries. 

target_link_libraries(# Specifies the target library. 
        test-lib 
        native-lib 
        # Links the target library to the log library 
        # included in the NDK. 
        ${log-lib}) 

И две мои JNI файлы одинаковы, как показано ниже, без имени функции

JNIEXPORT jstring JNICALL Java_com_cyweemotion_www_jnitest_MainActivity_stringFromJNI 
    (JNIEnv *env, jobject){ 
    __android_log_write(ANDROID_LOG_ERROR, "Tag", "Error here"); 
    std::string hello = "Hello from C++"; 
    return env->NewStringUTF(hello.c_str()); 
}; 

Мой build.gradle (модуль: приложение) является

android { 
    compileSdkVersion 23 
    buildToolsVersion "24.0.3" 
    defaultConfig { 
     minSdkVersion 19 
     targetSdkVersion 24 
     versionCode 2 
     versionName '1.02' 
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
     externalNativeBuild { 
      cmake { 
       cppFlags "" 
      } 
     } 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
      signingConfig signingConfigs.config 
     } 
     debug { 
      jniDebuggable false 
     } 
    } 
    externalNativeBuild { 
     cmake { 
      path "CMakeLists.txt" 
     } 
    } 
    productFlavors { 
    } 
} 

Согласно android document:Add C and C++ Code to Your Project. Я думаю, что могу использовать log api.

Что не так в моем коде или моей настройке?


Update:

Я нашел, что это не проблема в моей первой библиотеки JNI (код Update).

Это происходит только во второй библиотеке.

ex: target_link_libraries (test-lib, native-lib, ...), native-lib - вторая библиотека для загрузки.

Так что native-lib не может использовать log api.

Теперь я могу только сделать, чтобы удалить native-lib. Однако я действительно хочу знать, почему?

+0

Я считаю, что в документе есть опечатка. Оператор может просто выглядеть как 'target_link_libraries (log)' –

+0

Я забыл намекнуть, что загрузил две библиотеки jni. Теперь я нашел log api, который можно использовать в первом. Но не во втором. –

+0

Да, это важная деталь –

ответ

4

Наконец-то я нашел, что я должен был разделиться, чтобы сделать ссылку.

target_link_libraries(# Specifies the target library. 
        test-lib 
        native-lib 
        # Links the target library to the log library 
        # included in the NDK. 
        ${log-lib}) 

target_link_libraries(# Specifies the target library. 
        native-lib 
        # Links the target library to the log library 
        # included in the NDK. 
        ${log-lib})