/tmp/cckCgXyx.o:(.data+0x28): undefined reference to `hidden alias for int BemVindo::main()'
/tmp/cckCgXyx.o:(.data+0x74): undefined reference to `hidden alias for int BemVindo::main()'
collect2: ld returned 1 exit status
O código é esse:
public class BemVindo{
public native int main();
static{
System.loadLibrary("hello");
}
public static void main(String args[]){
new BemVindo().main();
}
}
Olhando bem rapidamente o seu problema, talvez o que esteja acontecendo é que você declarou a função “nativa” com o nome main (palavra reservada em C++ e Java).
Tente mudar o nome desta função em public native int main(); para ver se funciona
public class Carnival
{
// Carregamento da biblioteca que será criada.
static {
System.loadLibrary("Carnival");
}
// Método marcado com modificador "native".
public native void dance(String verse);
public static void main(String[] args) {
new Carnival().dance("...pode chorar, mas chora...");
}
}
Olha só, o erro também aconteceu comigo, e era porque eu não tinha a pasta lib do local que eu estava compilando o código C.
Agora, eu não consegui fazer rodar perfeitamente o programa com o método System.loadLibrary, por isso modifiquei para System.load. A diferença é que este método exige o caminho completo do arquivo, diferente do loadLibrary, que exige o nome da biblioteca.
Então meu código Java ficou assim:
import java.io.File;
public class Carnival {
// Método marcado com modificador "native".
public native void dance(String verse);
// Carregamento da biblioteca que será criada.
static {
System.load("/tmp/libCarnival.so");
}
public static void main(String[] args) {
new Carnival().dance("...pode chorar, mas chora...");
}
}
/tmp/cckCgXyx.o:(.data+0x28): undefined reference to `hidden alias for int BemVindo::main()'
/tmp/cckCgXyx.o:(.data+0x74): undefined reference to `hidden alias for int BemVindo::main()'
collect2: ld returned 1 exit status
O código é esse:
public class BemVindo{
public native int main();
static{
System.loadLibrary("hello");
}
public static void main(String args[]){
new BemVindo().main();
}
}
Exato. Quando você executa o “javah”, ele cria a assinatura do método em C, que será chamado pelo Java.
Repare que o(s) parâmetro(s) que você passou ao chamar o método em Java vem logo após os parâmetros “env” e “obj”
Quando precisei utilizar JNI, fiz da seguinte forma (talvez seja uma boa solução para você também).
1 - No Java, criei como seria a chamada do método, com os parâmetros necessários. No seu caso talvez seria:
public native void dance(int argc, String args[], String texto);
2 - Criei a assinatura do método com o javah
3 - Depois, no método em C com a assinatura criada, simplesmente chamei a minha função em C, que já estava pronta. No seu caso, talvez algo do tipo (não sei se o javah irá gerar isso, estou tirando da minha cabeça):
JNIEXPORT void JNICALL Java_Carnival_dance(JNIEnv * env, jobject obj, jint argc, jstring args[], jstring texto) {
//Atribua os parâmetros argc, args e texto
//Chame sua função drawText aqui.
}
Com isso, você cria uma interface entre o código Java e o código C, porém não mexe na sua função que já está pronta.
public class App{
// Carregamento da biblioteca que será criada.
static {
System.loadLibrary("AppDrawText");
}
// Método marcado com modificador "native".
public native void drawText(int argc, String args[], String texto);
public static void main(String[] args) {
new AplicacaoLavid().drawText("TESTE");
}
}
App.java:12: error: The method drawText(int, String[], String) in the type App is not applicable for the arguments (String)
new App().drawText("TESTE");
^^^^^^^^
1 problem (1 error)
public class AplicacaoLavid{
// Carregamento da biblioteca que será criada.
static {
System.loadLibrary("AppDrawText");
}
// Método marcado com modificador "native".
public native void drawText(String texto);
public static void main(String[] args) {
new AplicacaoLavid().drawText("TESTE");
}
}
Eu acho que está faltado um espaço entre o “-lpthread” e o “-I/opt/jdk/include/linux”, pois o compilador está reclamando que não encontra a biblioteca.
Se não for isso, verifique onde está a biblioteca “pthread” (talvez o nome do arquivo seja libpthread.so), e passe este caminho com o parâmetro -L (ex.: -L/usr/lib).
Exception in thread "main" java.lang.NoClassDefFoundError: AplicacaoLavid
at gnu.java.lang.MainThread.run(libgcj.so.10)
Caused by: java.lang.ClassNotFoundException: AplicacaoLavid not found in gnu.gcj.runtime.SystemClassLoader{urls=[], parent=gnu.gcj.runtime.ExtensionClassLoader{urls=[], parent=null}}
at java.net.URLClassLoader.findClass(libgcj.so.10)
at gnu.gcj.runtime.SystemClassLoader.findClass(libgcj.so.10)
at java.lang.ClassLoader.loadClass(libgcj.so.10)
at java.lang.ClassLoader.loadClass(libgcj.so.10)
at gnu.java.lang.MainThread.run(libgcj.so.10)
Recompilei, deu certo a questao do classpath tal.
acho que agora é mais a questao de código do directfb, pois está dando o seguinte erro:
(!) DirectFBCreate: DirectFBInit has to be called before DirectFBCreate!
AplicacaoLavid.c <60>:
(#) DirectFBError [DirectFBCreate (&dfb)]: Initialization error!