linux环境下Jnative使用报org.xvolks.jnative.exceptions.NativeException

yuboy123456789 2011-12-29 11:55:10
最近做一个项目: 使用jnative调用动态库(.dll或.a文件),在windows环境下,能够完成dll动态库的调用,但是放到linux下面,改用.a文件格式的动态,jnative在linux下使用的libJNativeCpp.so已经放入/usr/lib路径下,调用时就发生异常:
org.xvolks.jnative.exceptions.NativeException: Library /opt/finger/lib/libBLServerAPI.a not found : /opt/finger/lib/libBLServerAPI.a: invalid ELF header
at org.xvolks.jnative.JNative.nLoadLibrary(Native Method)
at org.xvolks.jnative.JNative.<init>(JNative.java:348)
at org.xvolks.jnative.JNative.<init>(JNative.java:269)
at finger.UserCall.verifyMatch(UserCall.java:55)
at finger.FingerAction.authFinger(FingerAction.java:230)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:452)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:291)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:254)
at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)

代码如下:
public int verifyMatch(String fingerAuth, String fingerSign, int matchResult)
throws NativeException, IllegalAccessException {
JNative Something = null;
if (Something == null) {
Something = new JNative("/opt/finger/lib/libBLServerAPI.a", "BLM_VerifyMatch");
// 利用org.xvolks.jnative.JNative 来装载 libBLServerAPI.a BLModuleServerAPI
// FNetSDK_Client.dll,并利用其BLM_OpenModule方法
Something.setRetVal(Type.INT);
// 指定返回参数的类型
}
int i = 0;
Pointer fingerAuthPointer = creatCharPointer();
Pointer fingersignPointer = creatCharPointer();
Pointer resultPointer = creatPointer();

fingerAuthPointer.setMemory(Base64.decode(fingerAuth));
fingersignPointer.setMemory(Base64.decode(fingerSign));

Something.setParameter(i++, fingerAuthPointer);
Something.setParameter(i++, fingersignPointer);
Something.setParameter(i++, resultPointer);

Something.invoke();// 调用方法

return resultPointer.getAsInt(0);
}

请哪位高手知道这是什么问题啊?


...全文
603 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
准备工作: 1.编译JnativeCpp 2.将编译出来的libJNativeCpp.so,拷贝到/usr/lib/,同时执行chmod 555 libJNativeCpp.so 测试过程简介 1.c测试库libtest.so 环境:ubuntu10.4下 语言:c 编译库名称为:libtest.so 涉及文件:so_test.h test_a.c test_b.c test_c.c 终端执行命令:$ gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so 将编译得到到libtest.so拷贝到/usr/lib/,同时执行chmod 555 libtest.so 2.qt测试库libmylib.so 环境:ubuntu10.4下 语言:c 编译工具:qt Creator 编译库名称为:libmylib.so 将编译得到到libmylib.so拷贝到/usr/lib/,同时执行chmod 555 libmylib.so 3.编译环境安装 a.安装jdk 1.6 b.安装netBeans 6.8 c.创建javaApp工程 d.将JNative.jar添加到工程中 e.参考如下代码,编写后编译执行,并运行 import org.xvolks.jnative.JNative; import org.xvolks.jnative.Type; import org.xvolks.jnative.exceptions.NativeException; public class Main { public static void main(String[] args) throws NativeException, IllegalAccessException{ //纯c写到动态库 JNative clib = new JNative("libtest.so", "test_a"); //调用libtest.so下到test_a函数 clib.setRetVal(Type.STRING); //设置此函数的返回值 clib.invoke(); //函数执行 System.out.println(clib.getRetVal());//输出函数返回结果 //qt写到动态库 //以下部分使用qt编译到so,注意在函数声明前加 extern "C" //如extern "C" const char* getLocalHost(); JNative getstring = new JNative("libmylib.so", "getstring"); getstring.setRetVal(Type.STRING); getstring.invoke(); System.out.println(getstring.getRetVal()); } } 4.输出结果 this is in test_a... getstring hello .....

50,547

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧