我用的是LINUX,前几天问了JAVA的环境变量设置问题,收获很大.后来生成了bo.so文件,我在test.java中调用它.
test.java的内容:
import bo;
public class testwq{
public static void main(String[] args)
{
...........
}
}
然后我用javac test.java编译它
出现:
testwq.java:1: '.' expected
import bo;
^
1 error
请问: 是哪出错了,该怎么解决?(然后我删去了"import bo;",javac test.java通过,只是java test时:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no goodluck in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1517)
at java.lang.Runtime.loadLibrary0(Runtime.java:788)
at java.lang.System.loadLibrary(System.java:834)
at testdll.<clinit>(testdll.java:5)
at testwq.main(testwq.java:7)
)
test.java的内容:
import bo;
public class testwq{
public static void main(String[] args)
{
...........
}
}
然后我用javac test.java编译它
出现:
testwq.java:1: '.' expected
import bo;
^
1 error
请问: 是哪出错了,该怎么解决?(然后我删去了"import bo;",javac test.java通过,只是java test时:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no goodluck in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1517)
at java.lang.Runtime.loadLibrary0(Runtime.java:788)
at java.lang.System.loadLibrary(System.java:834)
at testdll.<clinit>(testdll.java:5)
at testwq.main(testwq.java:7)
)
export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH 写成 export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH `pwd`不就直接就是当前目录了吗第二import是引入一个包,而这里动态库是bo.so根本就不用import
第三System.loadLibrary(String name)的用法就是直接load一个动态库文件,不需要写扩展名,系统会觉得使用什么扩名,
只要在你的类中写成,一般写在static块中static{
System.loadLibrary("bo");
}上面的语句类加载初始化的时候就会在你的环境变量中设置的lib目录下寻找对应的动态库,linux下会去找bo.so,windows下会去找bo.dll只要动态库加载之后,你就可以使用你定义的本地方法了而动lib变量不需要设置当前目录的,这个不同于java的classpath,加载动态库首先会在当前目录下找所需的动态库文件
test.java:6: cannot resolve symbol
symbol : class bo
location: class test
bo test = new bo();
^
test.java:6: cannot resolve symbol
symbol : class bo
location: class test
bo test = new bo();
^
2 errors
我知道是libbo.so的问题,我想问JNI调用的动态库中的函数一定要和JAVA语法完全兼容么?比如一些数据结构,一些LINUX系统调用函数,尤其请推荐有关JNI for LINUX的电子图书或相关书籍,谢谢!