2016-01-21 66 views
0

我想從C調用java,和我做了下面的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 

當我用make編譯我得到一個錯誤這樣的:

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

我查看了很多帶有類似問題的stackoverflow頁面,但他們都有我已經實現的相同的解決方案。他們說你需要將庫路徑鏈接到jni.h.

正如你可以在我的生成文件看到這個正在做:

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 include目錄由編譯器不鏈接中使用。編譯器無法找到你的.h文件。

您可能還需要改變目標如下

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

這將爲你.so文件。

相關問題