java调用第三方so或者dll常见错误整理
1.关于 LINK : fatal error LNK1561: 必须定义入口点 的解决方法
每个应用程序(文件格式为exe)都应该有个启动点,这个点就是main函数。缺少就会出现link error 。
解决方法有2
1.添加含有main函数的CPP文件
2 右击属性,在常规项中修改配置类型,将应用程序修改为库,动静态库
2.Cannot open include file: jni.h: No such file or directory解决方法
在此运行Visual Studio 2012 项目时出现
#include <stdio.h>
#include <jni.h>
int main()
{
printf("Hello World");
}
But when I try to build, I get the following error -
1>c:testtest.cpp(2) : fatal error C1083: Cannot open include file: 'jni.h': No such file or directory
解决办法。
就是到jdk的安装目录下include下把以下相应的文件,复制到vc目录下的include文件夹下
\jdk\include\jni.h
\jdk\include\win32\jawt_md.h
\jdk\include\win32\jni_md.h
主是jdk安装目录下的三个文件,分别复制它们到vc目录下的include文件夹下。如我的安装位置是:C:\Program Files\Microsoft Visual Studio 11.0\VC\include
3.win10系统下cmd调用cl编译器编译c++环境变量配置
修改“zzw06的用户变量”,编辑PATH,添加:
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin;C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt
新建“系统变量”:
INCLUDE=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include;C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt
LIB=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10240.0\ucrt\x86
所有目录请按照个人实际情况填写,即可以在cmd中使用cl命令了。
如果出现错误如缺失math.h等,可以在visualstudio安装目录中或C盘Program Files (x86)文件中搜索,将目录添加到环境变量中。
4. 因为调用的第三方dll是32位的,所以需要更改本地的jdk版本,出现如下问题
Error:java: 无效的目标发行版: 1.8
修改的第一个地方
修改的第二个地方:
5.解决 idea 项目中Error:java: 无效的标记: -XX:MaxPermSize=512M
file-settings-下图,删掉全部图中标注处
6.jna调用c接口报unable to load library xxxx.so
1、cd /etc 2、vim ld.so.conf 把需要加载的so文件夹路径,放到ld.so.conf 里,我这边是/home/test/lib 3、重启ldconfig
ps:如果中间有报错了,应该是少依赖,对应加上就行了
用ldd libxxxx.so 查看依赖
7.JNI头文件错误 error: unknown type name 'JNIEXPORT'
在网上找了一会,最终找到问题所在,我的.c文件缺少头文件 #include <jni.h>导致,加上之后就OK了。
8.so动态链接库编译问题
今天进行jni开发进行so文件的编译碰到一些错误现在记录如下,供参考避免范重复错误。
编译命令范例:
g++ -fPIC -shared -I /usr/lib/jvm/jdk1.7.0/include/ -I /usr/lib/jvm/jdk1.7.0/include/linux/ -o libhelloworld.so -cpp HelloWorld.cpp
1. 如果少了 -share 提示
cannot dynamically load executable
2. 如果少了 -c或者-cpp或提示
only ET_DYN and ET_EXEC can be loaded
3. -fPIC是产生位置无关代码,就是可以不固定的内存位置执行代码(就是可以动态链接的意思了),动态链接库必须添加。
- 本文标签: Java JNI
- 本文链接: https://www.yynhworld.cn/article/8
- 版权声明: 本文由御影年华原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权