2016-01-21 4 views
0

Я пытаюсь вызвать Java от C, и я сделал следующее Makefile:Makefile: ошибка: <jni.h>: Нет такого файла или каталога

include ../../Makefile.defs 

auto_gen= 
NAME=libproto.so 
CC=gcc 
CFLAGS= -g -Wall -fPIC 
LIBS= -L'$(LD_LIBRARY_PATH)' -ljvm -I"/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.91.x86_64/include/" -I"/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.91.x86_64/include/linux" -I"/usr/local/lib64/kamailio/" 
include ../../Makefile.modules 


SOURCE=jni_wrapper.c ProtoType.c 
OBJECTS=$(SOURCE:.c=.o) 

all: $(SOURCE) $(NAME) 

%.o: %.c 
    $(CC) $(CFLAGS) -c $(LIBS) $< 

clean: 
    rm -f $(EXEC); rm -f *~; rm -f .*.swp; rm -f .*.swo; rm -f *.o 

java: 
    javac ProtoType.java 
    jar cf ProtoType.jar ProtoType.class 
    javap -s -p ProtoType > sigs.txt 
    cat sigs.txt 

Когда я компилирую с макияж, я получаю сообщение об ошибке, как это:

error: <jni.h>: No such file or directory 

Я просмотрел много страниц stackoverflow с аналогичной проблемой, но все они имеют одно и то же решение, которое я уже реализовал. Они сказали, что вам нужно связать путь библиотеки с jni.h.

Как вы можете увидеть в моем Makefile это делается:

LIBS= -L'$(LD_LIBRARY_PATH)' -ljvm -I"/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.91.x86_64/include/" -I"/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.91.x86_64/include/linux" -I"/usr/local/lib64/kamailio/" 

Я тройной проверил каталоги и разрешение, и все прекрасно.

Любые предложения?

ответ

1

Вы должны добавить конец вашего определения LIBS к CFLAGS

CFLAGS= -g -Wall -fPIC -I"/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.91.x86_64/include/" -I"/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.91.x86_64/include/linux" -I"/usr/local/lib64/kamailio/" 
LIBS= -L'$(LD_LIBRARY_PATH)' -ljvm 

Параметр -I включает в себя каталоги, используемый компилятор не линкер. Это компилятор, который не может найти ваш .h-файл.

Вы также можете изменить цели следующим образом

%.o: %.c 
    $(CC) $(CFLAGS) -c $< 
$(NAME): $(OBJECTS) 
    $(CC) $(OBJECTS) -o [email protected] $(LIBS) 

Это создаст вам .so файл.

Смежные вопросы