Tecnologia do Blogger.
RSS

Re: [androidbrasil-dev] Duvias Android Studio e JNI

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_AbreSerialSAT


Você tem que criar a classe no java igual ao nativo, faça assim:
1) crie o pacote: com.dimep.satjni
2) crie a classe: SatJni
3) 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 nativos

2016-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 assim
public 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 .so 

2016-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).


Thiago

2016-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)I

Dentro do apk tem o .so

Se 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 gerado
4) este erro é que estas libs estão com dependência na libhoudini.so, você precisa incluir ela também
5) 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 erro
java.lang.UnsatisfiedLinkError: dlopen failed: library "/system/lib/libhoudini.so" not found

achei na net uns caras falando de colocar no gradle estas linhas
task 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 JNI

    Tenho 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.so

    No Android Studio

    Eu pedi uma pasta JNI e coloquei os 4 primeiros arquivos que citei

    Depois 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 linha
ndk {
moduleName "sat-jni"
}

    Depois disso ao fazer make do meu produto da o erro
Error:(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.properties 
         de  distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip 
      para  distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip 
    e no build.gradle da aplicação
         de  com.android.tools.build:gradle:1.3.0
      para  com.android.tools.build:gradle-experimental:0.6.0-alpha7

    mas ai tive o erro
Error:(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 mesmo
android.useDeprecatedNdk=true

    Dai aparentemente até achou minhas libs e tal mas dai estou com o erro
Error: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 2

    Eu 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.

  • Digg
  • Del.icio.us
  • StumbleUpon
  • Reddit
  • RSS

0 comentários:

Postar um comentário