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是产生位置无关代码,就是可以不固定的内存位置执行代码(就是可以动态链接的意思了),动态链接库必须添加。

猜你喜欢

转载自blog.csdn.net/wkfyynh/article/details/104862917