2016-08-07 4 views
0

Я пытаюсь построить .c файл на OSX, но я получаю:JNI построить C файл (Неопределенные символы для архитектуры x86_64)

Undefined symbols for architecture x86_64 

#include "Test.h" 

JNIEXPORT jint JNICALL Java_Test_test 
    (JNIEnv * env, jclass cls, jbyteArray s, jlong ss, jbyteArray sss, jlong ssss, jbyteArray sssss, jlong ssssss) { 

    /*printf("Hello World!\n");*/ 
    return 1; 
} 

Встраиваемых с:

clang++ -o test -I/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/include/darwin Test.cpp 

Undefined symbols for architecture x86_64: "_main", referenced from: 
    implicit entry/start for main executable ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) 

Есть ли что-то, что мне нужно для установки?

ответ

0

clang++ -o test Test.cpp пытается скомпилировать и ссылку для создания исполняемого исполняемого файла. Вы не определили main(), поэтому, конечно, это не удается, когда он пытается связать код CRT (который называет поставляемые пользователем main().)

Возможно, вы имели в виду использовать clang++ -fPIC -shared -o libtest.so Test.cpp -I... (сохраняя все остальные параметры те же), для создания общей библиотеки, такой как JNI. Или .dylib или .jnilib, какие бы библиотеки ни назывались на вашей платформе.

Если вы следуете руководству, которое не сообщило вам, как скомпилировать ваш код, это, вероятно, не очень хороший учебник, и вы должны найти лучшую документацию.

+1

Возможно, это не правильный ответ, так как модуль JNI является общим объектом, и вы создадите файл прямых объектов. –

+0

@MichaelPetch: да, это имеет смысл. '-fPIC -shared' должен быть прав, IIRC. –

+1

OP говорит OSX, поэтому, вероятно, это должно быть '.dylib' или' .jnilib' (и я бы предоставил файл префикс 'lib' и не является теперь отсутствующей командой' -o'?) – user2543253