Problemas com o uso Shared Object C ++ com Android Estúdio

votos
-1

Eu estou tentando entender como estúdio android trabalha com bibliotecas compartilhadas .so arquivo. Sua simples Olá Mundo com C ++ funciona bem, mas eu estou trabalhando em portar um grande conjunto de código C ++ ao Android e quer entender a maneira mais fácil de fazê-lo. Eu não necessariamente deseja adicionar o arquivo CMakeLists.txt para Android estúdio desde parte do código não é construir usando cmake.

O que tenho feito é criado dois projetos no Android Studio. Olá Mundo CPP com suporte C ++ e ele funciona muito bem. Além disso, criei um Java mundo Olá! (Sem o C ++) de apoio.

Meu objetivo era levar os arquivos libnative-lib.so criados no projeto Olá Mundo CPP, copiá-los para o Java mundo Olá! E alterar o código Java para fazer referência a função stringFromJNI ().

Na versão Java, eu criei o apps / diretório src / main / jniLibs e copiado em todo o ./app/build/intermediates/transforms/mergeJniLibs/debug/0/lib/ diretório da versão CPP. Estes são os arquivos que eu trouxe de novo.

~ / AndroidStudioProjects / HelloJava / app / src / main / jniLibs $ ls -R:. Arm64-V8A armeabi-v7a x86_64 x86

./arm64-v8a: libnative-lib.so

./armeabi-v7a: libnative-lib.so

./x86: libnative-lib.so

./x86_64: libnative-lib.so

Eu, então, voltou para a classe MainActivity na versão Java e copiado sobre o

  static {
        System.loadLibrary(native-lib);
    }

e adicionou-se o seguinte para o final da onCreate. (Eu adicionei o ID para a montagem de forma R.id.sample_text é válido.)

TextView tv = (TextView) findViewById(R.id.sample_text);
tv.setText(stringFromJNI());

Construir funciona bem, mas quando eu tento rodar em um AVD, eu recebo o seguinte erro.

E/.gary.hellojav: No implementation found for java.lang.String com.example.gary.hellojava.MainActivity.stringFromJNI() (tried Java_com_example_gary_hellojava_MainActivity_stringFromJNI and Java_com_example_gary_hellojava_MainActivity_stringFromJNI__)
D/AndroidRuntime: Shutting down VM

Eu removi a chamada stringFromJNI e ele funciona muito bem na AVD. Eu mudei o nome da biblioteca na chamada loadLibrary a algo inválido e loadLibrary lança uma exceção por isso parece que ele encontra a biblioteca, eu só não pode resolver o nome stringFromJNI muito bem.

Qualquer sugestão ou supervisão óbvia da minha parte?

Publicado 14/09/2018 em 15:23
fonte usuário
Em outras línguas...                            


1 respostas

votos
0

Eu encontrei o problema. O problema no arquivo o nativo-lib.cpp, o nome totalmente qualificado estava incorreta quando eu passar de um projeto para a próxima vez que o nome do projeto foi embutida no stringFromJNI. Eu precisava mudar

Java_com_example_gary_hcpp_MainActivity_stringFromJNI

para

Java_com_example_gary_hjava_MainActivity_stringFromJNI
Respondeu 14/09/2018 em 15:58
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more