红联Linux门户
Linux帮助

jni需要注意的常见问题

发布时间:2011-12-12 12:34:18来源:红联作者:雾月O秋水
最近学习了jni,总结一些心得体验,希望给大家有点帮助。在学习jni的过程中,遇到一些常见的问题。在这里就不再谈及怎样调用jni的步骤,网上查找即可,在此推荐一篇写的调用很全的文章:http://netcome.iteye.com/blog/monthblog/2010-06?show_full=true

下面是我在编写过程中遇到的问题:
1.输入的问题:C/C++语言的.c或者.c++的文件一定要尽量手打输入,这样可以避免格式上输入的错误。例如:
testjni.cpp:10: error: stray ‘\240’ in program
testjni.cpp:10: error: stray ‘\302’ in program
testjni.cpp:10: error: stray ‘\240’ in program
testjni.cpp:14: error: stray ‘\302’ in program
testjni.cpp:14: error: stray ‘\240’ in program
testjni.cpp:14: error: stray ‘\302’ in program
testjni.cpp:14: error: stray ‘\240’ in program
testjni.cpp:16: error: stray ‘\302’ in program
testjni.cpp:16: error: stray ‘\302’ in program
testjni.cpp:16: error: stray ‘\302’ in program
testjni.cpp:16: error: stray ‘\302’ in program
这就是一个很明显由于从网页上复制下来粘贴而引起的空格与linux下的space键不同的问题,最好自己手动输入,或者替换,替换不一定好。在写native函数的时候最好也从相对应的.h文件复制函数名与参数。

2. 找不到相应的库文件链接的问题,如:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no testjni1 in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1738)
at java.lang.Runtime.loadLibrary0(Runtime.java:823)
at java.lang.System.loadLibrary(System.java:1028)
at Weiwei.(Weiwei.java:9)
Could not find the main class: Weiwei. Program will exit.
临时解决的办法:
a.设置export LD_LIBRARY_PATH=./ 即可,在输出就可以的了
b.java -Djava.library.path=. -cp . 类名
c.可以调用System.out.print(System.getProperty("java.library.path")); 来查看! 然后把libXXXX.so(windows环境将.dll文件)拷贝到那里面的目录下去
3.Linux下编译下找不到库文件符号的问题:libXXX.so: undefined symbol: _ZdlPv
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
这是由gcc与g++用的不当造成的。具体的用法是:
jstr=env->NewStringUTF(str);是C++中的写法,不必使用env指针。因为JNIEnv函数的C++版本包含有直接插入成员函数,他们负责查找函数指针。而对于C的写法,应改为:jstr=(*env)->NewStringUTF(env,str);因为所有JNI函数的调用都使用env指针,它是任意一个本地方法的第一个参数。env指针是指向一个函数指针表的指针。因此在每个JNI函数访问前加前缀(*env)->,以确保间接引用函数指针,因而可以以此来判断。
文章评论

共有 2 条评论

  1. Dsucov 于 2011-12-12 16:36:00发表:

    本人还看不懂,555555

  2. 龙王爷88 于 2011-12-12 13:49:42发表:

    不错,正好需要哦{:2_91:}