Estou tentando usar o NDK com C ++ e não consigo obter a convenção de nomenclatura de método correta. meu método nativo é o seguinte:
extern "C" {
JNIEXPORT void JNICALL Java_com_test_jnitest_SurfaceRenderer_drawFromJni
(JNIEnv* env, jclass c)
{
//
}
}
com um cabeçalho envolvido em extern "C" {} também.
Tudo compila bem, cria um arquivo .so e copia para a pasta libs em meu projeto, mas quando eu depuro e executo no Eclipse, continuo recebendo uma mensagem de log cat de "nenhuma implementação encontrada para nativo ...". Há algo que estou perdendo, pois todos os exemplos de NDK estão em C?
Obrigado.
android
android-ndk
Patrick Kafka
fonte
fonte
javah
? Se não, você deveria estar. :-PSystem.loadLibrary
Respostas:
Existem algumas coisas que podem levar a "nenhuma implementação encontrada". Um está obtendo o nome do protótipo da função errado, outro está deixando de carregar o .so. Tem certeza de que
System.loadLibrary()
está sendo chamado antes de o método ser usado?Se você não tem uma
JNI_OnLoad
função definida, você pode querer criar uma e fazer com que ela exiba uma mensagem de log apenas para verificar se a lib está sendo puxada com sucesso.Você já se esquivou do problema mais comum - esquecer de usar
extern "C"
- então é o acima ou algum pequeno erro de ortografia. Qual é a aparência da declaração Java?fonte
Uma causa adicional para esse erro: o nome do método nativo não decorado não deve conter sublinhado!
Por exemplo, eu queria exportar uma função C chamada
AudioCapture_Ping()
. Aqui está minha declaração de exportação em C:Aqui estava minha classe Java importando a função:
Não consegui que o Android se vinculasse dinamicamente ao meu método nativo até remover o sublinhado:
fonte
Tive o mesmo problema, mas para mim o erro estava no arquivo Android.mk. Eu tinha isso:
mas deveria ter isto:
observe o detalhe + = ao invés : =
Espero que ajude.
fonte
Chamado extern "C" conforme fornecido no exemplo do Studio gerado automaticamente, mas esqueci de envolver todo o restante do arquivo, incluindo as funções a seguir, entre {} colchetes. Apenas a primeira função funcionou.
fonte
Um motivo adicional: use LOCAL_WHOLE_STATIC_LIBRARIES em vez de LOCAL_STATIC_LIBRARIES no android.mk. Isso impede que a biblioteca otimize as chamadas API não utilizadas porque o NDK não pode detectar o uso de ligações nativas do código java.
fonte
Há um exemplo de cpp em apps em ndk: https://github.com/android/ndk-samples/blob/master/hello-gl2/app/src/main/cpp/gl_code.cpp
fonte
Use javah (parte do Java SDK). É a ferramenta exatamente para isso (gera o cabeçalho .h do arquivo .class).
fonte
Se o nome do seu pacote inclui _ caractere, você deve escrever 1 (um) após _ caractere, conforme mostrado abaixo:
MainActivity.java
native-lib.cpp
fonte
Tento todas as soluções acima, mas ninguém consegue resolver meu erro de compilação (jni java.lang.UnsatisfiedLinkError: Nenhuma implementação encontrada para ...), finalmente descobri que esqueci de adicionar meu arquivo de origem verify.cpp em CMakeList.txt segmento add_library (verify.cpp é gerado automaticamente pela tecla curta Ctrl + Enter, talvez outro nome de arquivo), espero que minha resposta possa ajudar alguém.
meu ambiente de construção: Gradle + CMake
fonte
Eu enfrentei o mesmo problema e, no meu caso, o motivo foi que eu tinha sublinhado no nome do pacote "RFID_Test". Renomeei o pacote e funcionou. Obrigado user1222021
fonte
Eu enfrentei o mesmo problema duas vezes. Acontece que o telefone que tentei iniciar o aplicativo do Android Studio usava um nível de API que ainda não baixei no Android Studio.
fonte