Как вызвать функции C из кода Java в Linux - PullRequest
4 голосов
/ 15 ноября 2011

Я пишу программу на Java на Suse Linux 11, используя JavaSE-1.6, и у меня возникла проблема при сборке с использованием 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

Ответы [ 3 ]

2 голосов
/ 15 ноября 2011

со страницы, на которую вы ссылались:

Библиотека, содержащая реализацию собственного кода, загружается вызов System.loadLibrary (). Размещение этого звонка в статическом инициализатор гарантирует, что эта библиотека загружается только один раз для каждого класса. библиотека может быть загружена за пределы статического блока, если ваше приложение требует этого. Возможно, вам потребуется настроить свою среду, чтобы Метод loadLibrary может найти вашу библиотеку собственного кода.

Мой акцент. Вы установили LD_LIBRARY_PATH (или что-либо еще подходящее) для вашей системы?

1 голос
/ 15 ноября 2011

Я предлагаю вам запустить which javac, чтобы определить, какой компилятор вы используете. Если вы хотите Java 6, вы не можете использовать gcj. Вы должны исправить свой путь, используя javac из JDK 6.

0 голосов
/ 15 ноября 2011

Я думаю, вам следует установить и использовать Sun Java SDK вместо использования компилятора gcc javac.

Google для suse javac gcc выдает множество похожих проблем, и решение всегда кажетсябыть использовать Sun JDK.

...