Perfeito Thiago,
-- Eu me perguntava mesmo, caramba por que eu coloco as chamadas dos métodos na minha classe, mas não tinha entendido que era para o java fazer o link (corrija se eu estiver errado)
É que em C# isto vai em cima do método e ai não precisa ter o mesmo pacote (ou namespace)
Muito obrigado, mesmo. To te devendo uma.
Estou colocando o grupo android em copia para ficar registrado lá a solução
2016-01-26 15:00 GMT-02:00 Thiago Lopes Rosa <thiago.rosa@gmail.com>:
O erro está aí...int Java_com_dimep_satjni_SatJni_AbreSerialSATVocê tem que criar a classe no java igual ao nativo, faça assim:1) crie o pacote: com.dimep.satjni2) crie a classe: SatJni3) adicione o método: public native int AbreSerialSAT(String commPort, int baud, int nBits, int paridade, int nStops);4) faça o mesmo com todos os outros métodos nativos2016-01-26 14:56 GMT-02:00 Tiago Grillo <tijgrillo@gmail.com>:no wrapper.c o metodo é esta assim/**
* @name AbreSerialSAT
* @brief Configura os parametros de comunicacao da porta serial apontada por commPort
* @param commPort - Porta Serial 0 COM1 , 1 COM2... ou o dispositivo /dev/ caso seja compilado para Linux.
* @param baud : baudrate
* @param nBits: Numero de stop bits
* @param paridade: Paridade 0-Sem paridade, 1-Paridade par, 2- Impar
* @param nStops
* @return COMM_ERROR
*/
int Java_com_dimep_satjni_SatJni_AbreSerialSAT(JNIEnv *env, jobject j,
jstring commPort, int baud, int nBits, int paridade, int nStops) {
int ret;
char aux[100];
const char *port = (*env)->GetStringUTFChars(env, commPort, 0);
return AbreSerialSAT(port, 115200, 8, 1, 1);
}na minha classe a assinatura esta assimpublic native int AbreSerialSAT(String commPort, int baud, int nBits, int paridade, int nStops);Obs: Lembrando que no meu projeto eu não coloquei o wrapper.c só os .so2016-01-26 14:45 GMT-02:00 Thiago Lopes Rosa <thiago.rosa@gmail.com>:É...Esse erro indica que ele não está encontrando o método nativo correspondente...A assinatura da função do lado do java tem que bater extamente com o do nativo...Veja qual a assinatura do AbreSerialSAT lá no nativo (provavelmente no wrapper.c).Thiago2016-01-26 14:42 GMT-02:00 Tiago Grillo <tijgrillo@gmail.com>:isso?static {System.loadLibrary("sat-jni");}2016-01-26 14:25 GMT-02:00 Thiago Lopes Rosa <thiago.rosa@gmail.com>:Você fez o System.loadLibrary()?2016-01-26 14:15 GMT-02:00 Tiago Grillo <tijgrillo@gmail.com>:Thiago a dll foi um tropeço (habito windows)O erro do libhoudini.so deve ser por causa do emulador, no dispositivo é outro, eu não estava conseguindo ver por que o dispositivo só tem uma usb ai não consigo debugar, mas a agora tive a "brilhante" ideia de baixar um logcat direto no aparelho e o erro é01-26 13:55:36.190 E/AndroidRuntime(3496): java.lang.UnsatisfiedLinkError: Native method not found: br.jrs.cloudbox1.act.FinalizarVendaAct.AbreSerialSAT:(Ljava/lang/String;IIII)IDentro do apk tem o .soSe eu te mandar um app simples exemplo, pode ver para mim oq esta errado?---------- Forwarded message ----------
From: Thiago Lopes Rosa <thiago.rosa@gmail.com>
Date: 2016-01-26 12:43 GMT-02:00
Subject: Re: [androidbrasil-dev] Duvias Android Studio e JNI
To: androidbrasil-dev <androidbrasil-dev@googlegroups.com>1) não é dll, é so... ;)2) sim, ele linka dinamicamente com a chamada System.loadLibrary()3) veja se as libs estão dentro do APK gerado4) este erro é que estas libs estão com dependência na libhoudini.so, você precisa incluir ela também5) não é exception, é error, por isso não pega no try/catch--2016-01-26 11:53 GMT-02:00 Tiago Grillo <tijgrillo@gmail.com>:Thiago tentei simplesmente criar a pasta jniLibs e colocar lá os .so (em suas respectivas pastas) tenho o seguinte errojava.lang.UnsatisfiedLinkError: dlopen failed: library "/system/lib/libhoudini.so" not foundachei na net uns caras falando de colocar no gradle estas linhastask copyJniLibs(type: Copy) {
from 'libs/armeabi'
into 'src/main/jniLibs/armeabi'
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn(copyJniLibs)
}
clean.dependsOn 'cleanCopyJniLibs'mas o erro persiste, o interessante, ou não, é que meu android studio não reconhece os metodos da dll, mas o projeto compila normal. mas quando chamo uns deles vem o erro acima e o aplicativo para, mesmo com try catch.--2016-01-26 10:51 GMT-02:00 Thiago Lopes Rosa <thiago.rosa@gmail.com>:Primeiramente, se eles já forneceram as libs pré-compiladas acho que você não precisa compilá-las novamente (apenas se você fizer alguma alteração no wrapper.c).O ndk-build no Android Studio ainda é muito limitado (pelo menos até a última vez que mexi nele). Ele gera o próprio Android.mk durante a compilação, ou seja, ele não está utilizando o Android.mk fornecido.No seu caso, acho que basta colocar as libs dentro do diretório jniLibs separadas pelos ABIs corretos (no padrão é src/main/jniLibs/seus_targets_abi/sua_lib.so), do mesmo jeito que você disse que elas já estão separadas.Thiago--2016-01-26 10:33 GMT-02:00 Tiago Grillo <tijgrillo@gmail.com>:--Ola,Preciso por umas classes nativas de um fornecedor no meu projeto para fazer a integração, mas tá dificil... :'(Vamos a minha saga... (o projeto exemplo que ele me mandou esta em eclipse)Eu tenho os arquivos Android.mk, Application.mk comm.h wrapper.c que estão na pasta JNITenho em libs as pastas armeabi, armeabi-v7a, mips e x86 que tem praticamente os mesmos arquivos (em questão de nome, entendo que cada um foi compilado para uma arquitetura de so).Nelas tem os arquivos gdb.setup, gdbserver, libsat-jni.so, libsatprotocol.soNo Android StudioEu pedi uma pasta JNI e coloquei os 4 primeiros arquivos que citeiDepois mudei a visão da IDE de Android para Project achei a pasta libs e copiei as 4 pastas e seus arquivos para lá.Na sequencia fui no build.gradle da app e coloquei a linhandk {
moduleName "sat-jni"
}Depois disso ao fazer make do meu produto da o erroError:(22, 0) Error: NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin. For details, see http://tools.android.com/tech-docs/new-build-system/gradle-experimental. Set "android.useDeprecatedNdk=true" in gradle.properties to continue using the current NDK integration.
<a href="openFile:C:\Projetos\CloudBox1\Droidl\CloudBox1\app\build.gradle">Open File</a>Ai pesquisei e achei na net que tenho que mudar no gradle-wrapper.propertiese no build.gradle da aplicaçãode com.android.tools.build:gradle:1.3.0para com.android.tools.build:gradle-experimental:0.6.0-alpha7mas ai tive o erroError:(1, 0) Plugin with id 'com.android.application' not found.
<a href="openFile:C:\Projetos\CloudBox1\Droidl\CloudBox1\app\build.gradle">Open File</a>Bom dai vi que poderia por uma tag no gradle.properties que diz para deixar eu usar o modo depreciado mesmoandroid.useDeprecatedNdk=trueDai aparentemente até achou minhas libs e tal mas dai estou com o erroError:Execution failed for task ':app:compileArmDebugNdk'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'C:\Users\tijgrillo\AppData\Local\Android\sdk\ndk-bundle\ndk-build.cmd'' finished with non-zero exit value 2Eu entendo que é por que esta faltando alguma configuração para conseguir compilar os arquivos da pasta jni.Minhas perguntas são:1) Tenho mesmo que por tudo isso no meu projeto?2) Não consigo por apenas um .jar (ou .qualquer_coisa) e usar?3) Qual a melhor forma de fazer? com sem o depreciado?4) Por favor se alguém tiver uma receita de bolo pra eu fazer esta porcar.. funcionar!?!?!Obrigado a todos,Tiago Grillo
You received this message because you are subscribed to the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to androidbrasil-dev+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
You received this message because you are subscribed to the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to androidbrasil-dev+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
You received this message because you are subscribed to the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to androidbrasil-dev+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
You received this message because you are subscribed to the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to androidbrasil-dev+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
You received this message because you are subscribed to the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to androidbrasil-dev+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
0 comentários:
Postar um comentário