一、什么是JNI

Java Native Interface(JNI)是Java语言的本地编程接口

是 Java 与操作系统本地代码互相调用的功能的接口

二、Java 调用C/C++步骤:

1、在Java类中声明native方法

新建一个 Java 工程 TestNativeCode    包  com.fomagic   类 Testnative

 package com.fomagic;

 public class TestNative {
public native void sayHello(); //C++本地代码实现
public static void main(String[] args) { }
}

2、使用javah命令生成包含native方法定义的C/C++头文件

3、按照生成的C/C++头文件来写C/C++ 源文件

1) 在VS 中新建  Win32控制台应用程序  –> 确定 –> 下一步(即选择应用程序设置)

2) 拷贝三个文件到 项目目录下

com_fomagic_TestNative.h          第2步生成的头文件

jni.h               位于 JDK 下的 include 文件目录中

jni_md.h             include—>win32 目录

3)  添加现有项 com_fomagic_TestNative.h   引入头文件(如图)

4)  新建 源文件 source.cpp  添加如下内容

5)  注意 引用的头文件“ <> ”代表从系统查找 、 “ ” “ ”  优先从本地查找

 

 #include "com_fomagic_TestNative.h"
#include <iostream>;
using namespace std; //对 com_fomagic_TestNative.h 中声明的方法定义
JNIEXPORT void JNICALL Java_com_fomagic_TestNative_sayHello (JNIEnv *evn, jobject obj)
{
cout<<"Hello World !"<<endl;
}

4、将C/C++源文件编译成动态链接库(DLL)可执行二进制代码

执行生成解决方案,在项目目录下的Debug 生成 DLL 文件

5、把DLL文件所在路径添加到PATH环境变量下

这个配置过Java环境变量的都应该是清楚的 , 这样可以方便Java程序直接调用当前的动态链接库

注意:需要注意的是Eclipse开发Java程序需要重启 来重新加载环境变量

6、java 类中加载DLL,然后调用声明的native方法

 package com.fomagic;
public class TestNative {
public native void sayHello(); //C++本地代码实现
public static void main(String[] args) {
System.loadLibrary("NativeCode"); //加载动态链接库,不能加 .dll
TestNative test=new TestNative();
test.sayHello();
}
}

7、运行Java 项目

1)  执行结果 :  Hello World !

2)  异常信息 :  Can’t load IA 32-bit .dll on a AMD 64-bit platform

解决办法:

前文中提到的的Java引用DLL动态链接库时,执行结果的 异常信息为: Can’t load IA 32-bit .dll on a AMD 64-bit platform

原因:由于你的windows操作系统是64位,win32控制台程序默认生成 32位的 DLL 动态链接库

解决办法:  可想而知我们需要一个64位的DLL动态链接库,那就来生成一个

1、通过原来的VS项目 配置 (如图)

2、这时候生成则在  项目目录—-> x64 —-> Debug  目录 生成  NativeCode.dll

3、同理,把DLL文件所在路径添加到PATH环境变量下 ,方便Java程序加载, Eclipse则需要重启重新加载环境变量

三、弊端及注意点

  1. 使用JNI,这个java Application 将不能跨平台,如果要移植到别的平台上,则 native代码需要重新进行编写
  2. java是强类型语言,而C/C++则不是,因此,必须在写JNI时更加小心
  3. 在构建java程序的时候,尽量少用本地代码

转自:http://www.fomagic.com/index.php/232.html

JNI笔记1的更多相关文章

  1. JNI笔记之 初体验

    Java Native Interface提供了java与c语言写的代码之间互相调用的方式.在c语言方面jni.h中声明了许多的类型和方法,有很多java的数据类型和c语言类型的转换方法函数. jav ...

  2. JNI笔记

    由于要做一个能够加红字体的dialog,而cocos2d中的CCMessageBox是系统内带的,我无法修改其字体颜色.事实上是可以修改的,通过观察发现CCMessageBox被调用后,在安卓平台中会 ...

  3. Ubuntu 16.04 安装opencv3.4.5/cuda/caffe并使用jni笔记

    因操作失误,误卸开发机NVIDIA显卡驱动,先更新操作日志如下: 1>NVIDIA驱动重装 1.卸载系统里的Nvidia残余 sudo apt-get purge nvidia* 2.把显卡驱动 ...

  4. 【Android Studio安装部署系列】二十五、Android studio使用NDK生成so文件和arr文件

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 Android Studio使用ndk的简单步骤. NDK环境搭建 下载NDK 下载链接:https://developer.and ...

  5. 《Android开发艺术探索》读书笔记 (13) 第13章 综合技术、第14章 JNI和NDK编程、第15章 Android性能优化

    第13章 综合技术 13.1 使用CrashHandler来获取应用的Crash信息 (1)应用发生Crash在所难免,但是如何采集crash信息以供后续开发处理这类问题呢?利用Thread类的set ...

  6. 《android开发艺术探索》读书笔记(十四)--JNI和NDK编程

    接上篇<android开发艺术探索>读书笔记(十三)--综合技术 No1: Java JNI--Java Native Interface(java本地接口),它是为了方便java调用C. ...

  7. JNI学习笔记_Java调用C —— 非Android中使用的方法

    一.学习笔记 1.java源码中的JNI函数本机方法声明必须使用native修饰. 2.相对反编译 Java 的 class 字节码文件来说,反汇编.so动态库来分析程序的逻辑要复杂得多,为了应用的安 ...

  8. JNI学习笔记_C调用Java

    一.笔记 1.C调用Java中的方法,参考jni.pdf pg97可以参考博文:http://blog.csdn.net/lhzjj/article/details/26470999步骤: a. 创建 ...

  9. JNI学习笔记_Java调用C —— Android中使用的方法

    一.笔记 1.JNI(Java Native Interface),就是如何使用java去访问C/C++编写的那些库.若想深入了解JNI可以看官方文档jni.pdf.优秀博文:Android JNI知 ...

随机推荐

  1. .NET平台开源项目速览(9)软件序列号生成组件SoftwareProtector介绍与使用

    在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下Software Protector序列号生成组件.今天就通过一篇简单的文章来预览一下其强大的功 ...

  2. EntityFramework之原始查询如何查询未映射的值,你又知道多少?

    前言 今天又倒腾了下EF,如题所示,遇到了一些问题,并最终通过尝试找到了解决方案,可能不是最终的解决方案,若你有更好的解决方案,望告知,同时通过阅读此文,定让你收获不少. 引入 当我们查询时一直是中规 ...

  3. JavaScript操作Cookie

    在Web开发中,我们经常使用Cookie保存一些不是非常敏高的数据.比如“下次自动登录”,“广告显示”等功能.定义是:某些网站为了辨别用户身份而存储在用户本地终端(主要是浏览器)上的数据.定义域RFC ...

  4. 从零开始编写自己的C#框架(4)——文档编写说明

    在写本系列的过程中,了解得越多越不知道从哪里做为切入点来写,几乎每个知识点展开来说都可以写成一本书.而自己在写作与文档编写方面来说,还是一个初鸟级别,所以只能从大方面说说,在本框架开发所需的范围内来讲 ...

  5. MyCAT日志分析

    MyCAT日志对于了解MyCAT的运行信息不可获取,譬如MyCAT是否采用读写分离,对于一个查询语句,MyCAT是怎样执行的,每个分片会分发到哪个节点上等等. 默认是info级别,通过log4j.xm ...

  6. II7.0 发布 MVC 4.0 三个小问题记录

    1,403.14-Forbidden Web 服务器被配置为不列出此目录的内容 根据提示更改:使用 IIS 管理器启用目录浏览. 打开 IIS 管理器. 在“功能”视图中,双击“目录浏览”. 在“目录 ...

  7. 学C++的经验总结

    下面的是学C++时要注意的. 1.把C++当成一门新的语言学习(和C没啥关系!真的.): 2.看<Thinking In C++>,不要看<C++变成死相>: 3.看<T ...

  8. 关于在aspx前台使用后台变量的问题

    我们经常会在后台定义一个变量,然后在用<%=变量名%>这种方式去获取,但是有时候<head></head>里面获取变量的时候,有时候会获取不到是怎么回事呢 前台: ...

  9. web api中的RouteHandler

    ASP.NET MVC4中引入的Web API可以说是进行REST软件开发的利器(个人意见),但是最近在web form中混入web api时,发现一个问题:由于以前的web form项目中,使用到了 ...

  10. php基础知识

    PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言[脚本在服务器上执行]. PHP 文件能够包含文本.HTML.CSS 以及 PHP 代码,在服务器上的执行结果以纯文本返回浏览器. php可以 ...