java调用第三方的dll文件出错

云飞扬° 2019-12-29 08:49:27
厂商接供了访问该dll文件的java类,该类使用了JNI接口,故无法改变该类的类名和包名。该类没有包名,即默认无包名的类,必须放到程序运行的src目录下。
我所有的类若使用厂商提供的类访问dll文件,也必须不能带包名,即放到src目录下,但是根据项目的结构,肯定不能放在src目录下,有什么解决办法吗?
...全文
149 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunyiz 2019-12-30
  • 打赏
  • 举报
回复
引用 5 楼 云飞扬° 的回复:
[quote=引用 4 楼 sunyiz 的回复:]
或者换个思路,你把那个JNI接口类,直接单独放到一个jar包里
你的项目中,引用那个jar包,
这样至少你的项目中,看起来是没有什么类放置在src根目录下的

我试了一下,但是JNI接口类中没有main方法,用IDEA打不成jar包啊?[/quote]

IDEA 没用过不知道,
但是eclipse 打 jar 包时是有两种选项的:
可执行jar和非执行jar
非执行jar,就无需main方法,直接打包

或者你编译出 .class
然后 jar cvf xxx.jar xxx.class 自己用命令打包
云飞扬° 2019-12-30
  • 打赏
  • 举报
回复
引用 6 楼 sunyiz 的回复:
IDEA 没用过不知道, 但是eclipse 打 jar 包时是有两种选项的: 可执行jar和非执行jar 非执行jar,就无需main方法,直接打包 或者你编译出 .class 然后 jar cvf xxx.jar xxx.class 自己用命令打包
我试了,但还是报错 Exception in thread "main" java.lang.UnsatisfiedLinkError: com.neurosky.ThinkGear.GetNewConnectionId()I at com.neurosky.ThinkGear.GetNewConnectionId(Native Method)
sunyiz 2019-12-29
  • 打赏
  • 举报
回复
引用 2 楼 云飞扬° 的回复:
我自己写的类是可以自己定义包名,如果要调用JNI接口类中的方法,可以用反射来实现。我想问的是能不能把JNI接口类放在包里面?厂家给的开发包里也没有提供源码,所以重编译不了,除了重编译,有啥办法吗?

或者换个思路,你把那个JNI接口类,直接单独放到一个jar包里
你的项目中,引用那个jar包,
这样至少你的项目中,看起来是没有什么类放置在src根目录下的
sunyiz 2019-12-29
  • 打赏
  • 举报
回复
引用 2 楼 云飞扬° 的回复:
我自己写的类是可以自己定义包名,如果要调用JNI接口类中的方法,可以用反射来实现。我想问的是能不能把JNI接口类放在包里面?厂家给的开发包里也没有提供源码,所以重编译不了,除了重编译,有啥办法吗?

没有源码肯定没办法啊
不能换包名的原因是,JNI的C代码中,把JNI调用路径(对应的java类路径)写死在头文件中的
除非你能拿到C的源码,自己重新编译,否则这个需求是没法实现的
云飞扬° 2019-12-29
  • 打赏
  • 举报
回复
我自己写的类是可以自己定义包名,如果要调用JNI接口类中的方法,可以用反射来实现。我想问的是能不能把JNI接口类放在包里面?厂家给的开发包里也没有提供源码,所以重编译不了,除了重编译,有啥办法吗?
sunyiz 2019-12-29
  • 打赏
  • 举报
回复
不是啊,只有JNI接口类不能换包名类名,
你自己的类,如果只是调用哪个JNI接口类中的方法,包名类名是可以自己定义的啊
云飞扬° 2019-12-29
  • 打赏
  • 举报
回复
引用 4 楼 sunyiz 的回复:
或者换个思路,你把那个JNI接口类,直接单独放到一个jar包里 你的项目中,引用那个jar包, 这样至少你的项目中,看起来是没有什么类放置在src根目录下的
我试了一下,但是JNI接口类中没有main方法,用IDEA打不成jar包啊?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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