JNI是Java自带的方法,不需要引入第三方jar包,优点是因为是java自带的方法,兼容性较好,缺点就是代码书写繁琐

  1. 新建Java项目Test --> 新建测试类TestNative,声明本地方法,代码如下:
  1. package com.test;
  2. public class TestNative {
  3. public native void sayHello();
  4. public static void main(String[] args) {
  5. System.loadLibrary("NativeProject");
  6. TestNative test = new TestNative();
  7. test.sayHello();
  8. }
  9. }

使用eclipse编写的类会直接在项目bin目录下自动生成.class文件。如果不使用eclipse,请手动使用javac生成.class文件

  1. 生成.h头文件,使用cmd命令行工具切换到项目src这一层目录,键入指令:
  1. javah -classpath D:\Users\Administrator\workspace\Test\bin com.test.TestNative

注意

  • -classpath后面跟的为Java项目bin目录完整路径
  • 类名必须加上包名
  1. 使用vs2015生成DLL文件,新建WIN32项目NativeProject --> 勾选DLL --> 空项目

  2. 去java项目src目录下复制刚刚生成的 com_test_TestNative.h,jdk\include目录下的jni.h,jdk\include\win32目录下的jni_md.h这三个文件到c++项目NativeProject --> NativeProject文件夹下

  3. 右键NativeProject --> 添加 --> 现有项,把刚刚复制过来的三个.h头文件添加进来

  4. 打开com_test_TestNative.h文件,把头部#include <jni.h>改成#include "jni.h",否则不能成功导入,com_test_TestNative.h代码如下:

  1. /* DO NOT EDIT THIS FILE - it is machine generated */
  2. #include "jni.h"
  3. /* Header for class com_test_TestNative */
  4. #ifndef _Included_com_test_TestNative
  5. #define _Included_com_test_TestNative
  6. #ifdef __cplusplus
  7. extern "C" {
  8. #endif
  9. /*
  10. * Class: com_test_TestNative
  11. * Method: sayHello
  12. * Signature: ()V
  13. */
  14. JNIEXPORT void JNICALL Java_com_test_TestNative_sayHello
  15. (JNIEnv *, jobject);
  16. #ifdef __cplusplus
  17. }
  18. #endif
  19. #endif
  1. 右键NativeProject --> 新加项 --> 新加source.cpp文件,在该cpp文件实现方法,代码如下
  1. #include "com_test_TestNative.h"
  2. #include <iostream>
  3. using namespace std;
  4. JNIEXPORT void JNICALL Java_com_test_TestNative_sayHello(JNIEnv *, jobject) {
  5. cout << "Hello World!" << endl;
  6. }
  1. 点击生成 --> 生成解决方案 --> 去NativeProject下的DEBUG目录中复制NativeProject.dll文件到Java项目文件夹下。

  2. 运行Java测试类,运行成功

Java使用JNI调用DLL库的更多相关文章

  1. Java通过JNI调用dll详细过程(转)

    源:Java通过JNI调用dll详细过程 最近项目有这样一个需求,在已有的CS软件中添加一个链接,将当前登录用户的用户名加密后放在url地址中,在BS的login方法里通过解密判断,如果为合法用户则无 ...

  2. Java使用JNative调用DLL库

    编写测试DLL文件,源文件参照JNA调用用的DLL文件.地址:http://www.cnblogs.com/vevy/p/9076941.html (很重要)右键项目 --> 属性 --> ...

  3. Java使用JNA调用DLL库

    Java调用DLL方法有三种,JNI.JNA.JNative, 本文为JNA JNA为使用jna.jar包,下载地址:http://www.java2s.com/Code/Jar/j/Download ...

  4. Java(使用JNA)调用DLL库与C#调用DLL库的对比

    前言:在项目中经常使用DLL库对硬件进行操作,在发卡过程中使用频率尤为多,今天就Java与C#中调用DLL库的使用区别做一个介绍,本文着重具体的代码编写,具体过程看以下代码. 前提条件: 笔者已经封装 ...

  5. JAVA使用JNI调用C++动态链接库

    JAVA使用JNI调用C++动态链接库 使用JNI连接DLL动态链接库,并调用其中的函数 首先 C++中写好相关函数,文件名为test.cpp,使用g++编译为DLL文件,指令如下: g++ -sha ...

  6. [置顶] android利用jni调用第三方库——第三篇——编写库android程序整合第三方库libhello.so到自己的库libhelloword.so

    0:前言: 在第二篇中,我们主要介绍了丙方android公司利用乙方C++公司给的动态库,直接调用库中的方法,但是这样方式受限于: 乙方C++公司开发的动态库是否符合jni的规范,如果不规范,则不能直 ...

  7. [置顶] android利用jni调用第三方库——第二篇——编写库android程序直接调用第三方库libhello.so

    0:前言 1:本文主要作为丙方android公司的身份来写 2:作者有不对的地方,请指出,谢谢 [第一篇:android利用jni调用第三方库——编写库libhello.so] [第二篇:androi ...

  8. java 用JNA调用dll 参考文档

    1  Java调用C语言动态库(JNA方式):回调函数.结构体数组传参.结构体数组返回 2jna结构体数组  JNA结构体数组 3JNA调用C语言动态链接库学习实践总结 4 Java 通过 JNA 调 ...

  9. ubuntu下Java通过JNI调用C

    下面看一个实例,如下: public class TestJNI { static { System.loadLibrary("diaoyong"); // 程序在加载时,自动加载 ...

随机推荐

  1. composer windows安装,使用新手入门[转]

    原:https://blog.csdn.net/csdn_dengfan/article/details/54912039 一.前期准备: 1.下载安装包,https://getcomposer.or ...

  2. C#基础 集合

    //数组定义的时候 //需要定义数据类型 //需要定义初始长度 //int [] array = new int[5]; //int a = array.Length; //集合 //ArrayLis ...

  3. java IO流技术 之 File

    IO流技术 概念:input - output 输入输出流: 输入:将文件读到内存中: 输出:将文件从内存中写出到其他地方 作用:主要就是解决设备和设备之间的数据传输问题. File :文件类的使用十 ...

  4. Spring.Net学习笔记(八)-设置配置文件参数

    一.开发环境 VS2013 .netframework4.5 spring.net1.3.1 二.项目结构 三.开发过程 1.编写Person类 namespace SpringNetConfigAr ...

  5. CF822C Hacker, pack your bags!

    思路: 对于一个区间[l, r],只需枚举所有满足r' < l并且二者duration之和为x的区间[l', r'],寻找其中二者cost之和最小的即可.于是可以开一个数组a[],a[i]表示所 ...

  6. 如何删除sublime目录

    左侧栏的sublime目录一直删不掉,删除列直接变成了灰色. 今天才发现应该选择文件夹右击选择工程——从工程中删除文件夹. 这个设计真的很醉,删除这么常用的键还放进了第二层……

  7. 【工具】Github

    项目目录结构设计与git远程仓库的建立 git码云仓库建立:在码云网站上新建组织和项目. 配置sshkey认证和公钥:命令行ssh-keygen -t rsa -C "xxxxx@xxxxx ...

  8. React Native 出现红屏幕报连接服务失败

    最近移动项目组在本人的带领下切换进React Native开发应用,之前没接触过,用了几周之后,发现也就那么回事吧,小玩具项目用用还是可以的.今天Android小姑娘在Windows下出问题解决不了, ...

  9. 面试中的一些小问题之ES5和ES6的区别?

    1995年,JavaScript作为网景浏览器的一部分首次发布,起初并不叫JavaScript,而是叫LiveScript,但是因为当时Java正火,也算是为了搭上java的顺风车,于是改成了Java ...

  10. Redis系列(八)--缓存穿透、雪崩、更新策略

    1.缓存更新策略 1.LRU/LFU/FIFO算法剔除:例如maxmemory-policy 2.超时剔除,过期时间expire,对于一些用户可以容忍延时更新的数据,例如文章简介内容改了几个字 3.主 ...