过程主要分为以下几个步骤:

1、vs2017编写cpp/h代码,编译成dll,编译成功后,用depends查看库的依赖是否有缺失,也可以自己写个demo,调用这个dll中的函数,是否可以调用成功作为验证这个dll是否ok的方法。

注意:编译这个dll的cpp和h文件时,注意要extern "C",

eg:

cpp:

一定要注意红框的宏,不然会在java调用这个方法时提示:

Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function

2、将dll加入到jna 的jar包中,一般用好压打开,然后找到对应的目录,比如:java使用的是x64的jdk,dll也必须要是x64的,这个在编译dll时候选择,选择的方式如下:

第一次使用的时候,没有x64,新加一个就好了,具体可以百度怎么新加一个。如果二者不都是x64或者x86,java在使用的时候会提示找不到dll:

java.lang.UnsatisfiedLinkError: Unable to load library 'jndadll': Native library (win32-x86-64/jndadll.dll) not found in resource path

在确保dll可用的时候,将dll加入jna的jar包,一般用好压打开,然后放到对应的目录,我的是win32_64的,对应的目录是:com\sun\jna\win32-x86-64 直接拖进去就行。

3、idea工具编写demo使用jna中的c函数:

(1)、idea新建java工程

(2)、使用这个jna.jar包,方法:

注意红框中的操作步骤。

(3)、编写java代码:

public class TestJNA {

public interface CLibrary extends Library{

CLibrary INSTANCE = (CLibrary)Native.load("jndadll", CLibrary.class);

int checksum(String src_data, IntByReference check_ret);

}

public static void main(String[] args) {

// write your code here IntByReference check_ret = new IntByReference();

int flag = TestJNA.CLibrary.INSTANCE.checksum("123",check_ret);

System.out.println("MainActivity, checksum的返回标记:" + flag);

}

}

(4)、编译java,执行即可以了。其他使用可以参考jna官网手册java-native-access/jna

java调用c语言_Java调用C语言动态库(JNA方式,持续)相关推荐

  1. 编译c语言动态库,使用gcc、g++编译C/C++源程序,静态库和动态库创建方式

    后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序: 后缀为.cpp的,两者都会认为是c++程序. 注意,虽然c++是c的超集,但是两者对语法的要求是有区别的. 编译阶段,g++会调用gc ...

  2. graalvm把java编译为c/c++能够使用的动态库(dll/so)

    graalvm把java编译为c/c++能够使用的动态库(dll/so) 1.安装graalvm oracle官方企业版 github的openjdk版本 1.1 下载对应系统版本,配置环境变量 本人 ...

  3. java数组循环扩容_Java中实现数组动态扩容的两种方法

    Java中实现数组动态扩容的两种方法 java中初始化一个数组需要定义数组的容量,而在我们使用数组时往往会遇到数组容量不够的情况,此时我们就需要通过动态扩容的方式来来根据需求扩大数组的容量. 我们可以 ...

  4. C++ 调用lib 和 dll的 方法 及 动态库DLL与静态库lib的区别

    C++ 调用.lib的方法: 一: 隐式的加载时链接,有三种方法 1  LIB文件直接加入到工程文件列表中 在VC中打开File View一页,选中工程名,单击鼠标右键,然后选中"Add F ...

  5. c语言将程序写为动态库,VS下生成C程序静态库(LIB)及动态库(DLL)的方法

    一.前言 工作中有时候因为分工合作的原因需要让别人调用自己写的代码去完成某项功能,但是又不想让别人看到具体的实现过程,只是提供一个API形式的接口供别人调用:又或者是其他的一些原因,有必要学习静态库及 ...

  6. 【错误记录】NDK 导入外部 so 动态库报错 ( java.lang.UnsatisfiedLinkError | Android Studio 配置外部 so 动态库两种方法 )

    文章目录 一.报错信息 二.解决方案 ( Android Studio 配置外部 so 动态库两种方法 ) 1.jniLibs 目录存放 2.libs 目录存放 一.报错信息 外部引用 so 动态库 ...

  7. java执行python路径_java调用其它语言脚本(python、js)

    1.背景 之前用开发过程一些功能如图像处理.相似度计算.水印等需要调用算法写的方法,但是算法一般都是用python语言进行开发.所以经常直接用java调用python脚本文件.在网上搜了很多方法也排了 ...

  8. 仿照java做一个脚本语言_java调用其它语言脚本(python、js)

    1.背景 之前用开发过程一些功能如图像处理.相似度计算.水印等需要调用算法写的方法,但是算法一般都是用python语言进行开发.所以经常直接用java调用python脚本文件.在网上搜了很多方法也排了 ...

  9. java 调用c语言_Java 调用C语言JNI库(Hello World实例)

    要在java中调用c语言的库,一直觉得很不可思议,但是Java提供了JNI这个东西,这也就变得可能了. 作为一个码农,我们还是从最简单的 Hello World开始吧. 首先说一下我们想要做的事情. ...

最新文章

  1. 使用 fcntl 函数 获取,设置文件的状态标志
  2. 研究人员开发出全3D打印离子动力纳米卫星推进器
  3. 知乎赴美上市为缓解商业化瓶颈,下一步网络推广知乎想怎么做?
  4. HTTP与HTTPS区别(详细)
  5. PHP将mysql数据导出为Excel
  6. 移动端开发—流式布局
  7. c语言回顾之指针数组和数组指针
  8. 仿网易云音乐移动端html模板,使用jQuery仿制网易云音乐移动端
  9. 点餐系统数据库设计--SQL Server
  10. 机器视觉运动控制一体机应用例程|芯片引脚缺陷检测系统
  11. 苹果电脑(Mac)如何进行大小写和中英文的切换
  12. java 遍历json串_Java遍历Json数据
  13. SpringBoot统一异常拦截处理
  14. python opencv颜色通道_【Python+OpenCV之五】 分离颜色通道多通道图像混合
  15. 控制台调出Servers
  16. 头指针为head的带头结点的单链表判空条件head->next==null?
  17. 办公室装修设计6大规范示意
  18. 漫谈:一个工作两年半的程序员的人生感悟
  19. VSCODE: Merge-conflict设置
  20. 如何做好网络口碑营销?

热门文章

  1. HTTPie安装使用
  2. gedit  pycharm中的常用快捷键
  3. Andorid开发环境搭建
  4. JavaWeb_XML与Tomcat
  5. 关于 access 中如何使用 vba语言 判断表是否存在的两种方法
  6. [概念]MICCAI+BraTS+多模态t1,t2,flair,t1c+HGG,LGG+WT,ET,TC
  7. TensorFlow(keras)入门课程--03 卷积介绍
  8. 乐荐网络-μ+,打造个性化的搜人平台
  9. 6-3 结构体-成绩单排序
  10. 《技术的潜能:商业颠覆、创新与执行》一一2.2医疗技术:人工耳蜗