现在的位置: 首页 > 综合 > 正文

Ubuntu下用Javah生成JNI头文件出现找不到类的错误

2019年07月24日 ⁄ 综合 ⁄ 共 1079字 ⁄ 字号 评论关闭

在cygwin下可以很轻易地搞定javah jni生成native的头文件,但是在Ubuntu下尝试时出现找不到类的问题。

具体过程如下:

1)创建HelloWorld.java文件

$cd /opt/test/hello

$vim HelloWorld.java                 //创建了HelloWorld.java文件

2)编译生成class

$javac HelloWorld.java

生成HelloWorld.class类

3)调用javah -jni时出现错误

错误提示找不到类文件。

查找原因是类文件路径不对,需要更换javah调用格式,即先设置classpath

$javah -classpath xxx -jni HelloWorld

其中xxx表示HelloWorld.class类的存放路径。由于文件路径已经在hello目录下了,所以只需要调用

$javah -classpath . -jni HelloWorld

即可。切记其中的”-classpath .“必不可少,”.“表示当前路径。如果是其他路径下的话需要将路径加在-classpath后面

javah通用命令格式如下:

javah -classpath 类路径 -jni 类名

接下来编译生成.so

这个过程也是无穷尽的烦躁,跟cygwin下比较复杂很多。

1)首先遇到的问题如下

提示无法创建so,尽管提示已经用-fPIC编译,但是仍然有错误。

换一种方式调用:

这个错误引起的原因是参数没有添加-fPIC。

补充知识:

PIC就是position independent code,它的作用是代码共享,如果不加-fPIC,则加载.so文件的代码段时,代码段引用的数据对象需要重定位, 重定位会修改代码段的内容,这就造成每个使用这个.so文件代码段的进程在内核里都会生成这个.so文件代码段的copy.
在安装mysql和unbound容易出现这样的错误,解决方法在configure加如下参数--disable-shared --with-pic或者--enable-shared,在这里设置CFLAGS没有用

当在上面错误的命令中增加-fPIC后编译成功:

这里很奇怪的是其编译命令不像在cygwin模式下的命令。

cygwin模式下可以很容易将.o文件通过-shared命令编译为.so文件,但是在ubuntu环境下这种操作无法实现。

因此,只好改为直接编译.c文件生成.so

命令如上图。

抱歉!评论已关闭.