2011-11-15 18 views
4

Java SE-1.6を使用してSuse Linux 11にJavaプログラムを作成していますが、javacを使用してビルドに問題があります。LinuxでJavaコードからC関数を呼び出すには

私は

http://java.sun.com/developer/onlineTraining/Programming/JDCBook/jniexamp.html

と、これまでに以下のことを書かれているのチュートリアル以下午前:

package com.ctest; 

class CTest 
{ 
    // Native method declaration 
    native int testCall(); 

    // Load the library 
    static 
    { 
     System.loadLibrary("fpdpReaderLib"); 
    } 

    public static void main(String args[]) 
    { 
     int retVal; 

     // Create class instance 
     CTest cLangTest = new CTest(); 

     // Call native method 
     retVal = cLangTest.testCall(); 

     System.out.println(retVal); 
    } 
} 

私はのjavac CTest.javaを実行すると、私はエラーを取得:

/usr/lib/gcc/i586-suse-linux/4.3/../../../crt1.o: in function '_start': 
/usr/src/packages/BUILD/glibc-2.9/csu/../sysdeps/i386/elf/start.S:115: undefined reference to 'main' 
/tmp/cc97kcJu.o:(.data+0x28) undefined reference to 'hidden alias for int com::ctest::CTest::testCall()' 
/tmp/cc97kcJu.o:(.data+0x74) undefined reference to 'hidden alias for int com::ctest::CTest::testCall()' 
collect2: ld returned 1 exit status 

私は、Java版ではなくgccを使用していると思われますjavacですが、わかりません。

どのような問題が発生する可能性がありますか?

私はここに述べた "--main =" オプションを使用しようとしている

:私は今ちょうど入る前に

http://gcc.gnu.org/java/faq.html#4_1

ではなく、エラーのを:

/tmp/ccwfugWq.o:(.data+0x28) undefined reference to 'hidden alias for int com::ctest::CTest::testCall()' 
/tmp/ccwfugWq.o:(.data+0x74) undefined reference to 'hidden alias for int com::ctest::CTest::testCall()' 
collect2: ld returned 1 exit status 

答えて

0

私はあなたがすべきだと思いますgcc javacコンパイラを使用するのではなく、Sun Java SDKをインストールして使用してください。

Google for suse javac gccは、同様の問題を引き起こします。ソリューションは、常にSun JDKを使用するように思われます。

+0

ありがとうございました。私のJDKが台無しになってしまったので、再インストールしました。パスが修正され、問題なくjavacを実行でき、javahが正しくヘッダファイルを作成しました。 –

1

which javacを実行して、使用しているコンパイラを判断することをお勧めします。 Java 6が必要な場合は、gcjを使用することはできません。

The library containing the native code implementation is loaded by a call to System.loadLibrary(). Placing this call in a static initializer ensures this library is only loaded once per class. The library can be loaded outside of the static block if your application requires it. You might need to configure your environment so the loadLibrary method can find your native code library.

マイ重点を:あなたは、あなたが引用したページからJDK 6から

2

javacを使用しているので、あなたにPATHを修正する必要があります。 LD_LIBRARY_PATH(またはそれに該当するもの)をシステムに設定しましたか?

+0

ありがとう、それは私のJDKが台無しになったと判明し、今私はそれを再インストールしたパスが修正されていると私はjavacを問題なく実行することができ、javahは今私のヘッダーファイルを正しく作成しました。 –

関連する問題