首页 > 解决方案 > JNI目录结构c和java

问题描述

我创建了 3 个JNI类,由于我是编程新手,所以我只是将它们全部放在同一个文件中,但现在我必须从专业意义上为它们设置目录。

这包括src源代码和bin类,但我不知道将文件放在哪里.h以及.so如何编译所有内容以使其正常工作。

我试图研究类路径和其他东西,但我似乎只是被卡住了,无法让我的代码正常运行。我也试图理解和学习这个包,但我也坚持这一点。

#spaces are just for easier reading atm

cd /home/pi/git/GPIO_I2C
mkdir bin
javac -d bin /home/pi/git/GPIO_I2C/src/com/company/gpioi2c/gpio/GPIOMethods.java -h ./bin

cd bin
gcc -I/usr/lib/jvm/default-java/include -I/usr/lib/jvm/default-java/include/linux -c "com_comapny_gpioi2c_gpio_GPIOMethods.h"

cd /home/pi/git/GPIO_I2C/src/c

gcc -o libmyGPIOMethods.so -shared -fPIC -I/usr/lib/jvm/default-java/include -I/usr/lib/jvm/default-java/include/linux GPIOMethods.c -lc 

sudo cp libmyGPIOMethods.so /usr/lib
cd /home/pi/git/GPIO_I2C/
java -cp /home/pi/git/GPIO_I2C/bin/com/company/gpioi2c/gpio GPIOMethods

到目前为止,这只是我尝试为其中一种方法编译的内容,但我得到了还是取决于Could not load main classunsatisfied link error所做的更改?

标签: javacclassjava-native-interfacedirectory-structure

解决方案


如果您设法生成了 .so 文件,您需要做的是告诉 JVM 在哪里可以找到它。您可以通过添加-Djava.library.path=/directory/path/goes/here到 JVM 命令行来做到这一点。

(下一步,确保System.loadLibrary("myGPIOMethods")在尝试调用任何本机方法之前调用)。


推荐阅读