C++ JNI编译致命错误:JNI.h:没有这样的文件或目录
我正在为i2c传感器开发JNI库,但我的makefile无法正常工作,请有人看一下:C++ JNI编译致命错误:JNI.h:没有这样的文件或目录,c++,gcc,makefile,java-native-interface,g++,C++,Gcc,Makefile,Java Native Interface,G++,我正在为i2c传感器开发JNI库,但我的makefile无法正常工作,请有人看一下: CC = gcc #CFLAGS = -mtune=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard -marmv6z -Wall CFLAGS = -mtune=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard -marm -O3 -Wall -shared -I/usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt/
CC = gcc
#CFLAGS = -mtune=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard -marmv6z -Wall
CFLAGS = -mtune=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard -marm -O3 -Wall -shared -I/usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt/include -I/usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt/include/linux
LIBS= -L'$(LD_LIBRARY_PATH)' -ljvm
LD = ld
LDFLAGS =
OBJ = Test.o raspi.o i2c.o sht21.o
BIN = libpijava.so
gpio: $(OBJ)
$(CC) $(CFLAGS) -o $(BIN) $(OBJ) $(LDFLAGS) $(LIBS)
%.o: %.c
$(CC) $(CFLAGS) -c $<
clean:
rm -rf $(BIN) $(OBJ)
CC=gcc
#CFLAGS=-mtune=arm1176jzf-s-mfpu=vfp-mfloat abi=hard-marmv6z-Wall
CFLAGS=-mtune=arm1176jzf-s-mfpu=vfp-mfloat abi=hard-marm-O3-Wall-shared-I/usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt/include-I/usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt/include/linux
LIBS=-L'$(LD_LIBRARY_PATH)'-ljvm
LD=LD
LDFLAGS=
OBJ=测试o raspi.o i2c.o sht21.o
BIN=libpijava.so
gpio:$(OBJ)
$(CC)$(CFLAGS)-o$(BIN)$(OBJ)$(LDFLAGS)$(LIBS)
%.o:%.c
$(CC)$(CFLAGS)-c$<
清洁:
rm-rf$(BIN)$(OBJ)
我的JNIC文件是Test.cpp,它依赖于sht21.h、raspi.h和i2c.h
也改变了:
CC = gcc -I/usr/lib/jvm/default-java
#CFLAGS = -mtune=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard -marmv6z -Wall
CFLAGS = -mtune=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard -marm -O3 -Wall -shared -I/usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt/include -I/usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt/include/linux
LD = ld
LDFLAGS =
OBJ = Test.o raspi.o i2c.o sht21.o
BIN = libpijava.so
gpio: $(OBJ)
$(CC) $(CFLAGS) -o $(BIN) $(OBJ) $(LDFLAGS)
%.o: %.c
$(CC) $(CFLAGS) -c $<
clean:
rm -rf $(BIN) $(OBJ)
CC=gcc-I/usr/lib/jvm/default java
#CFLAGS=-mtune=arm1176jzf-s-mfpu=vfp-mfloat abi=hard-marmv6z-Wall
CFLAGS=-mtune=arm1176jzf-s-mfpu=vfp-mfloat abi=hard-marm-O3-Wall-shared-I/usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt/include-I/usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt/include/linux
LD=LD
LDFLAGS=
OBJ=测试o raspi.o i2c.o sht21.o
BIN=libpijava.so
gpio:$(OBJ)
$(CC)$(CFLAGS)-o$(BIN)$(OBJ)$(LDFLAGS)
%.o:%.c
$(CC)$(CFLAGS)-c$<
清洁:
rm-rf$(BIN)$(OBJ)
您需要通过向C编译器传递right-I
标志来设置正确的include目录。该目录非常依赖于系统。在Debian系统上,安装了default jdk headless
包,添加-I/usr/lib/jvm/default java/include
应该可以工作
我认为您将遇到
-ljvm
的链接器故障。对于JNI库,实际上不需要以这种方式链接JVM(仅适用于生成JVM的应用程序)。如果您确实需要-ljvm
,事情就更复杂了。我不认为有一个完全可移植的途径。在我的Debian系统上,它是/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server/libjvm.so
,甚至默认java
目录下的路径也包含amd64
引用,不幸的是。我也更改了它:发布在“编辑问题”中,但它仍然不起作用。您还必须安装默认jdk headless
包。不行,我正在运行它:包没有找到java路径很好,但我可以手动编译它,但我得到了链接问题正如我所说的,对于JNI库,如果您只想创建JNI库,实际上不需要链接-ljvm
。