JNI编译致命错误:jni.h:没有这样的文件或目录

时间:2017-07-24 10:34:39

标签: c++ gcc makefile java-native-interface g++

我正在研究iNc传感器的JNI lib,我无法让我的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/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)

我的JNI c文件是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)

1 个答案:

答案 0 :(得分:0)

您需要通过将正确的-I标志传递给C编译器来设置正确的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,甚至default-java目录下的路径也包含amd64引用。不幸的是。