簡體   English   中英

如何從Linux上的Java代碼調用C函數

[英]How do I call C functions from Java code on Linux

我正在使用JavaSE-1.6在Suse Linux 11上編寫Java程序,我在使用javac時遇到了問題。

我正在關注教程

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

我懷疑它是使用gcc而不是java版本的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

從您引用的頁面:

包含本機代碼實現的庫通過調用System.loadLibrary()加載。 將此調用放在靜態初始化程序中可確保每個類僅加載一次此庫。 如果應用程序需要,可以在靜態塊之外加載庫。 您可能需要配置環境,以便loadLibrary方法可以找到您的本機代碼庫。

我的重點。 您是否為系統設置了LD_LIBRARY_PATH(或任何適當的)?

我建議你運行which javac來確定你正在使用哪個編譯器。 如果你想要Java 6,你就不能使用gcj。 您需要修復PATH,以便使用JDK 6中的javac

我認為您應該安裝和使用Sun Java SDK而不是使用gcc javac編譯器。

Google for suse javac gcc引發了大量類似的問題,解決方案似乎總是使用Sun JDK。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM