Erro na execução de JNI

11 respostas
Growth

Olá.

Quando tento executar a linha de comando :

System.out.println( jni.sayHello() );

está devolvendo o erro : "Variable information unavailable for native methods"

Não estou conseguindo descobrir o que acontece.

Abaixo os códigos :

package Teste;

public class Metodos_JNI
  {

    public native String sayHello();

    static
      {
        System.loadLibrary( "Metodos_JNI" );
      }

  }
package Teste;

public class Executa_Metodos_JNI
  {

    public static void main( String[] args )
      {
        Metodos_JNI jni = new Metodos_JNI();
        System.out.println( jni.sayHello() );
      }

DLL :

#include "stdafx.h"
#include "Teste_Metodos_JNI.h" 




JNIEXPORT jstring JNICALL Java_Teste_Metodos_JNI_sayHello
  (JNIEnv *env, jobject obj) {
    return  env->NewStringUTF("Hello world");
}

11 Respostas

T

Isso deve ser uma mensagem do depurador (IDE Eclipse ou NetBeans), não um erro de execução.

Growth

olá.

Esqueci de uma informação importante: a linha que aparece na janela de console:

Exception in thread “main” java.lang.UnsatisfiedLinkError: sayHello

T

Sua DLL não está no PATH (PATH mesmo, não CLASSPATH).

Growth

Olá.

Coloquei o caminho da DLL no PATH, mas o problema continua acontecendo.

Getware

Qual o compilador que vc usou pra gerar a dll? Estava tentando fazer metodos nativos em java mas acabei desistindo pois nao consseguia gerar a dll corretamente.
obs.: Estava usando o compilador GCC

Growth

Estou usando o MSVC 6.0.

Growth

Pessoal, descobri o problema.

O nome da classe JNI do java não pode conter underscore:

eu estava usando desta forma: Metodos_JNI

O problema ocorre na geração do “.h”, pois os underscores são utilizados para separar o nome da classe dos outros nomes (pacote e método).

Código C com erro:

JNIEXPORT jstring JNICALL Java_Teste_Metodos_JNI_sayHello

Código C correto:

JNIEXPORT jstring JNICALL Java_Teste_MetodosJNI_sayHello

Geração correta do include (.h) :

javah -jni -classpath . Teste.MetodosJNI

Espero que esta explicação ajude aqueles que estão tendo o mesmo problema, e sirva de alerta para aqueles que virão a utilizar o JNI.

Obrigado a todos

T

estou tendo o seguinte problema com o eclipse c alguém puder me ajudar agradeço

An unexpected error has been detected by HotSpot Virtual Machine:

EXCEPTION_PRIV_INSTRUCTION (0xc0000096) at pc=0x10001057, pid=3232, tid=3684

Java VM: Java HotSpot™ Client VM (1.5.0_09-b03 mixed mode, sharing)

Problematic frame:

C [parport.dll+0x1057]

An error report file with more information is saved as hs_err_pid3232.log

If you would like to submit a bug report, please visit:

http://java.sun.com/webapps/bugreport/crash.jsp

T

C [parport.dll+0x1057]

Você está usando a ParPort, veja a documentação para ver se não é algum parâmetro errado.

fcmartins

Growth:
Pessoal, descobri o problema.

O nome da classe JNI do java não pode conter underscore:

eu estava usando desta forma: Metodos_JNI

O problema ocorre na geração do “.h”, pois os underscores são utilizados para separar o nome da classe dos outros nomes (pacote e método).

Código C com erro:

JNIEXPORT jstring JNICALL Java_Teste_Metodos_JNI_sayHello



Você gerou o nome manualmente ou pelo javah? O caracter “_” pode ser usado já que é substituído por “_1” nos nomes de métodos nativos, o javah inclusive já faz isso automaticamente.

T

Já verifiquei ta tudo certo fiz um teste com uma outra dll só pra mostrar uma string na tela e tb da erro

Criado 13 de novembro de 2006
Ultima resposta 16 de nov. de 2006
Respostas 11
Participantes 5