Dúvida com o JNI [RESOLVIDO]

11 respostas
Leco2

Bom dia pessoal,

Eu estava tentando utilizar o JNI mas estou com certos problemas
Até agora eu só consegui criar o .class, na hora q tento criar o header aparece o seguinte erro

C:>javah -jni HelloWorld

error: cannot access HelloWorld

bad class file: D:\Documents and Settings\Meus documentos\NetBeansProjects\HelloWorld\src\helloworld\HelloWorld.class

class file contains wrong class: helloworld.HelloWorld

Please remove or make sure it appears in the correct subdirectory of the classpath.

com.sun.tools.javac.util.Abort

at com.sun.tools.javac.comp.Check.completionError(Check.java:164)

at com.sun.tools.javadoc.DocEnv.loadClass(DocEnv.java:149)

at com.sun.tools.javadoc.RootDocImpl.(RootDocImpl.java:77)

at com.sun.tools.javadoc.JavadocTool.getRootDocImpl(JavadocTool.java:159)

at com.sun.tools.javadoc.Start.parseAndExecute(Start.java:330)

at com.sun.tools.javadoc.Start.begin(Start.java:128)

at com.sun.tools.javadoc.Main.execute(Main.java:66)

at com.sun.tools.javah.Main.main(Main.java:147)

javadoc: error - fatal error

Alguém pode me ajudar?

11 Respostas

E

javah -jni helloworld.HelloWorld

Leco2

hum…agora ta dando o seguinte erro

C:>javah -jni helloworld.HelloWorld
error: cannot access helloworld.HelloWorld
class file for helloworld.HelloWorld not found
javadoc: error - Class helloworld.HelloWorld not found.
Error: No classes were specified on the command line. Try -help.

tem alguma coisa haver com o classpath?

E

Sim senhor, é o seu classpath. Passe-o explicitamente no comando javah, se não me engano a opção é -classpath

Leco2

tá dando erro de illegal packeg name…

o diretório eu coloco inteiro até onde o HelloWorld está localizado né?

E

Eu não queria dizer isso, mas você sabe rodar um programa Java pela linha de comando? Se não souber, acho que você vai ter MUITOS problemas para fazer qualquer coisa com JNI. É que JNI exige que você saiba razoavelmente Java e C ao mesmo tempo. Se está com problemas para chamar o javah é porque está com problemas para entender como usar o Classpath.

Leco2

é talvez eu tenha q estudar um pouco mais sobre classpath antes…
qndo estiver manjando mais volto aqui vlw

Leco2

depois de ler muito conseguir criar o header e a dll!!

mas agora eu estou com um outro problema…qndo executo o programa da o seguinte erro

java.lang.UnsatisfiedLinkError: no HelloWorld in java.library.path

onde eu coloco as dll que criei?
no java_home?

B

Elas devem ficar no seu PATH, não no seu CLASSPATH. Se você for preguiçoso como eu, pode pô-las no c:\windows\system32.

Leco2

hehe então eu tinha feito um teste colocando no system32
mas ainda assim dá erro

java.lang.UnsatisfiedLinkError: C:\WINDOWS\system32\HelloWorld.dll: Can’t find dependent libraries

B

“Can’t find dependent libraries” - isso costuma ocorrer porque você compilou sua DLL em modo debug. Tente compilar sua DLL em modo release, de modo que ela não dependa de DLLs especiais do seu compilador que são usadas em modo debug.

Leco2

Só vim notificar q agora funcionou perfeitamente…
já consegui dar um load na dll !!!

o comando que eu estava dando para gerar a dll era o seguinte

cl -I"c:\arquivos de programas\Java\jdk1.6.0_11\include" -I"c:\arquivos de programas\Java\jdk1.6.0_11\include\win32" -MD -LD HelloWorld.c -FeHelloWorld.dll

O problema é que qndo vc usa o -MD vc linka a sua aplicação várias bibliotecas. Ai quando vc for chamar sua função vc tem q dar um System.load(); em todas essas outras dll que o -MD linkou (ou vc pode colocar no path). O problema é q não importa qntas dll eu linkasse sempre faltava uma. Ai eu li em um site que não precisava usar esse comando(-MD). Eu tb ainda não sei o porque, mas assim q eu tirei ele minha apicação funcionou perfeitamente.

No final ficou assim então

cl -I"c:\arquivos de programas\Java\jdk1.6.0_11\include" -I"c:\arquivos de programas\Java\jdk1.6.0_11\include\win32" -LD HelloWorld.c -FeHelloWorld.dll

ai é só pegar a Dll que foi gerada e colocar no dir q o path está indicando!!!

Aqui vai o site em q eu tirei essa info.: (http://witte-consulting.com/blog/jni-java-native-interface-exception-in-thread-main-javalangunsatisfiedlinkerror-can-t-find-dependent-libraries/)
E aqui é um material legal pra quem tá começando: http://java.sun.com/docs/books/jni/download/jni.pdf

vlw para aqueles que me ajudaram!

Criado 26 de outubro de 2010
Ultima resposta 29 de out. de 2010
Respostas 11
Participantes 3