我正在研究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)
答案 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
引用。不幸的是。