O que há de errado com meu arquivo make?
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := foo
LOCAL_SRC_FILES := foo.c
LOCAL_EXPORT_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)
foo.c
#include <string.h>
#include <jni.h>
#include <android/log.h>
#define LOG_TAG "foo"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
void test() {
LOGI("test");
}
ndk-build
foo.c:9: undefined reference to `__android_log_print'
ldLibs = ["android", "log"]
as opções do android.ndkVocê precisa adicionar
para Android.mk
fonte
Se você usa o Android Studio e gradle, ele ignora o Android.mk. Adicione isso ao seu arquivo build.gradle:
fonte
ldLibs
. Obrigado.ndk
parte no build.gradle dentro daapp
pasta ao invés da parte na pasta do projeto (nome do módulo).ldLibs.addAll(["android", "log"])
Para Android Studio 2.2 e tools.build:gradle:2.2.0 usando CMake, adicione ou edite linha em CMakeLists.txt:
Isso é conectar a biblioteca de registros à sua.
fonte
Se você atualizar para o Android Studio 2.1, as respostas acima não funcionam, é necessário usar ldLibs.add () para carregar a lib como abaixo:
fonte
Podemos vincular uma biblioteca compartilhada no Android de 3 maneiras. Nos 3 casos abaixo, as linhas mencionadas devem ser adicionadas em
Android.mk
Então, aqui estão as três maneiras.
Por algum motivo, se 1 não funcionar (não funcionou para mim), você pode tentar as 2 maneiras abaixo
Claro, você também precisa incluir
#include <android/log.h>
em seu arquivo C / H.fonte
Caso o projeto em que você está trabalhando tenha as seguintes características que diferem de outras respostas 'padrão':
O seguinte uso de target_link_libraries o torna:
Sendo
TARGET_NAME
o nome do destino a construir (tendo-o configurado anteriormente comadd_library
ouadd_executable
).find_library
é igualmente importante, bem como configurar o conjunto de ferramentas corretamente (use o conjunto de ferramentas fornecido pelo Android SDK emANDROID_SDK_HOME/cmake/<version>/android.toolchain.cmake
para que ele configure oCMAKE_SYSROOT
que é usado porfind_
comandos).fonte
Sim, você precisa adicionar:
LOCAL_LDLIBS := -llog
como as outras respostas / comentários especificaram, no entanto, a pergunta original não especifica se ele usa a biblioteca jni como:LOCAL_JNI_SHARED_LIBRARIES
ou comoLOCAL_REQUIRED_MODULES
.Posso dizer com certeza que ele o usou como:
LOCAL_REQUIRED_MODULES
por causa doLOCAL_EXPORT_LDLIBS := -llog
na pergunta ... a menos que tenha sido adicionado após uma edição.Se você usar
LOCAL_REQUIRED_MODULES
a biblioteca compartilhada é instalada em / system / lib em vez de no apk, porque é um módulo obrigatório. Portanto, você precisará adicionar emLOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
vez de apenasLOCAL_LDLIBS := -llog
para que quando o sistema de construção estiver construindo e vinculando a biblioteca compartilhada jni, ele terá as-llog
definições no local correto, disponíveis para serem construídas abaixo$OUT/root/system/lib
. Caso contrário, você continuará obtendo a mesma resposta, mesmo que apenas adicioneLOCAL_LDLIBS := -llog
.Então, quem comentou que
-L
não é necessário, e a outra resposta estava correta, na verdade errou nessa situação.fonte
Em vez de
usar
ldLibs.addAll(["android", "log"])
para o plugin experimentalfonte
Adicionar
para Android.mk
fonte
Isso me ajudou:
Android.mk
fonte
No android studio versão 2.2 e superior, há suporte embutido para CPP quando você cria um novo projeto. Além disso, o liblog.so é incluído por padrão. Nada a ser feito além de incluir o arquivo de cabeçalho (android / log.h).
Checkout app / CMakeLists.txt que é criado pelo estúdio quando criamos um novo projeto de estúdio Android. Podemos ver que os blocos find_library () e target_link_libraries () para loglib já estão presentes.
Além disso, preste atenção à sintaxe da função. Deveria ser:
No meu caso, deixei de fora o parâmetro de tag e acabei gastando bons 3 dias para descobri-lo.
Mais sobre CMake: Adicionar código C e C ++ ao seu projeto
fonte
-DCMAKE_CXX_FLAGS = "- llog" me ajuda
fonte
adicionar
LOCAL_SHARED_LIBRARIES:= liblog
ao Android.mk pode resolver meu problema. Isso ocorre porque o__android_log_print
é definido em libLogfonte
PARA construir com Android.bp, siga a solução abaixo:
Neste - android_log_print é definido no NDK, então, para isso, já existe uma biblioteca disponível. Use a biblioteca " liblog " usando a tag shared_libs , consulte o código abaixo:
fonte