本例子使用的操作系统MacOS, 64位JVM。

JNI编写的几个步骤如下:

编写Java代码,并注明native方法:

public class HelloJni {public native void displayHelloJni();public static void main(String[] args) {HelloJni helloJni = new HelloJni();helloJni.displayHelloJni();}static {System.loadLibrary("HelloJniImpl");}
}

其中声明displayHelloJni()方法为本地方法,在static静态块中用System.loadLibrary()加载本地库。

使用javac命令编译此java类:

javac com/xxx/clamaa/jni/HelloJni.java 

利用javah命令生成C语言的头文件(.h文件)

javah com.xxx.clamaa.jni.HelloJni

执行完成后,就在执行路径下生成名称为com_xxx_clamaa_jni_HelloJni.h的头文件:

#include <jni.h>
/* Header for class com_xxx_clamaa_jni_HelloJni */#ifndef _Included_com_xxx_clamaa_jni_HelloJni
#define _Included_com_xxx_clamaa_jni_HelloJni
#ifdef __cplusplus
extern "C" {
#endif
/** Class:     com_yonyou_clamaa_jni_HelloJni* Method:    displayHelloJni* Signature: ()V*/
JNIEXPORT void JNICALL Java_com_xxx_clamaa_jni_HelloJni_displayHelloJni(JNIEnv *, jobject);#ifdef __cplusplus
}
#endif
#endif

然后在同级的目录下新建一个HelloJniImpl.cpp文件,这个与HelloJni.java中定义的System.loadLibrary()的文件名一致。

#include "com_xxx_clamaa_jni_HelloJni.h"
#include <iostream>
#include <jni.h>
using namespace std;
/** Class:     HelloWorld* Method:    displayHelloWorld* Signature: ()V*/
JNIEXPORT void JNICALL Java_com_xxx_clamaa_jni_HelloJni_displayHelloJni(JNIEnv *, jobject){cout << "Hello Jni by clamaa!";return;
}

编译C++代码的时候在MacOS下和在Linux Windows有所不同, 不是编译成.so或者dll, 而是MacOS自己的jnilib. 并且jni.h的目录也比较特殊, 是/System/Library/Frameworks/JavaVM.framework/Headers/,执行的命令g++,

g++ -dynamiclib -o libhellojniimpl.jnilib HelloJniImpl.cpp -framework JavaVM -I/System/Library/Frameworks/JavaVM.framework/Headers

编译完成后,就生成libhellojniimpl.jnilib文件,此时执行结果为:

java com.xxx.clamaa.jni.HelloJni
>Hello Jni by clamaa!

生成的文件名称必须为: libhellojniimpl.jnilib,否则抛出异常:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no HelloJniImpl in java.library.pathat java.lang.ClassLoader.loadLibrary(ClassLoader.java:1857)at java.lang.Runtime.loadLibrary0(Runtime.java:870)at java.lang.System.loadLibrary(System.java:1119)at com.yonyou.clamaa.jni.HelloJni.<clinit>(HelloJni.java:16)

如果设置成带参数的本地方法,那么生成的参数会多一个jstring

Java_HelloWorld_print(JNIEnv *env, jobject obj, jstring str)

与原来的实现方式,调用方式都一样,这样简单的JNI实现就完成了。

如果我们在原来的cpp实现中加入一行抛出异常的代码:

cout << "Hello Jni by clamaa!";
throw 1;
return;

那么在执行的过程中也会抛出对应的错误:

java com.yonyou.clamaa.jni.HelloJni
>libc++abi.dylib: terminating with uncaught exception of type int
>Hello Jni by clamaa!Abort trap: 6

转载于:https://www.cnblogs.com/mmaa/p/5789917.html

JNI的一个简单实例相关推荐

  1. 学习ARM反汇编工具objdump和一个简单实例

    学习ARM反汇编工具objdump和一个简单实例 --参考朱有鹏ARM裸机编程 1.反汇编的原理&为什么需要反汇编 arm-linux-objdump -D led.elf > led_ ...

  2. ASP.NET MVC Framework体验(1):从一个简单实例开始

    概述 12月10日微软发布了ASP.NET 3.5扩展的预览版,在其中包括了ASP.NET MVC Framework.ASP.NET AJAX改进.ASP.NET动态数据支持.ASP.NET SIl ...

  3. Ajax实现局部数据交互的一个简单实例

    想要实现的功能:利用Ajax技术通过点击一个<button>按钮,然后在指定的文本框中输出想要的值. 1.使用Jsp创建一个前端页面. 1 <body> 2 <div s ...

  4. C++ 容器的综合应用的一个简单实例——文本查询程序

    [0. 需求] 最近在粗略学习<C++ Primer 4th>的容器内容,关联容器的章节末尾有个很不错的实例. 通过实现一个简单的文本查询程序,希望能够对C++的容器学习有更深的理解. 由 ...

  5. 关于图片轮播图的一个简单实例 以及实例中发现问题

    1.最近在学习JS的过程中,为了巩固水平做了一个简单的轮播图,以及在做的过程中发现一些问题(未解决!希望可以有大佬可以解释这个问题) 2.代码如下: <!DOCTYPE html> < ...

  6. Android Studio1.4.x JNI开发基础 - 简单实例

    接上一篇,搭建好基于Android Studio的环境之后,编写native代码相对来说也比较简单了.在Android上编写Native代码和在Linux编写C/C++代码还是有区别,Native代码 ...

  7. 用了N年的接口,你知道接口是什么吗?——一个简单实例说明接口的伟大意义...

    ASP.NET基础知识:简单的实例理解接口的伟大意义 WestGarden 2012-5-26 http://www.cnblogs.com/WestGarden/ 源代码:13033480群共享 首 ...

  8. 怎么获取上一个html网页传过来的值_爬虫:一个简单实例说明爬虫机制

    爬虫,我的简单理解就是通过写定的程序,利用计算机的高速的优势,批量高效的获取数据的一种机制.通常我们访问网站是通过浏览器,而爬虫就是通过程序访问网站,也就是让程序伪装成浏览器进行访问. ​Reques ...

  9. JNI介绍及简单实例

    JNI概念 JNI是Java Native Interface的缩写,中文为JAVA本地调用. 使用JNI, 可以调用用其他语言写成的库或程序, 尤其是C和C++. 好了,概念性的内容就不多介绍了, ...

最新文章

  1. postfix邮件服务器搭建
  2. 取消默认html打开文档,怎么取消mac默认打开文档方式
  3. websocketpp 只发送一次
  4. linux如何时间更新最新版本,桌面应用|Linux有问必答:如何更新过期版本的Ubuntu...
  5. LeetCode 多线程 1117. H2O 生成
  6. 【Python入门】第一个py程序
  7. oracle中如何创建dblink
  8. 数据挖掘-分类与预测-神经网络算法
  9. c++ msflexgrid 使用_丝杠支座组件C
  10. 运维工程师的生存法则
  11. IBM语音识别能力逼近人类水平,获深度学习巨头Yoshua Bengio盛赞
  12. sql 中WHERE字句中使用case when then
  13. 在 Ubuntu 18.04 上安装 Python 3.7
  14. Spring下载链接
  15. PMP考试中一些解题思路
  16. 极速office(Word)如何插入分数
  17. 【3】令人头疼—在安装pyenchant外部包时产生的意外事件
  18. 迪乐尼童鞋防骗子—常见网络骗子骗术防御要点
  19. 帆软报表列表_报表软件FineReport各类函数大全
  20. DM8168 Uboot使用EMAC1(TI源码使用默认的EMAC0)

热门文章

  1. 老年痴呆与LDL-C 低密度脂蛋白
  2. hadoop的HA高可用配置(没有搞完)
  3. Flink shell报错 For input string: 0x100
  4. Hive引擎改为Tez笔记
  5. 集群状态正常时需要的jps进程+是否需要部署到各个节点(持续更新中)
  6. 决策树(CART算法)针对中文文本分类
  7. 向算法传递函数:谓词
  8. OpenGL函数:wglCreateContext
  9. 4.1 简单方程的解
  10. springboot 项目依赖