JNI的一个简单实例
本例子使用的操作系统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的一个简单实例相关推荐
- 学习ARM反汇编工具objdump和一个简单实例
学习ARM反汇编工具objdump和一个简单实例 --参考朱有鹏ARM裸机编程 1.反汇编的原理&为什么需要反汇编 arm-linux-objdump -D led.elf > led_ ...
- ASP.NET MVC Framework体验(1):从一个简单实例开始
概述 12月10日微软发布了ASP.NET 3.5扩展的预览版,在其中包括了ASP.NET MVC Framework.ASP.NET AJAX改进.ASP.NET动态数据支持.ASP.NET SIl ...
- Ajax实现局部数据交互的一个简单实例
想要实现的功能:利用Ajax技术通过点击一个<button>按钮,然后在指定的文本框中输出想要的值. 1.使用Jsp创建一个前端页面. 1 <body> 2 <div s ...
- C++ 容器的综合应用的一个简单实例——文本查询程序
[0. 需求] 最近在粗略学习<C++ Primer 4th>的容器内容,关联容器的章节末尾有个很不错的实例. 通过实现一个简单的文本查询程序,希望能够对C++的容器学习有更深的理解. 由 ...
- 关于图片轮播图的一个简单实例 以及实例中发现问题
1.最近在学习JS的过程中,为了巩固水平做了一个简单的轮播图,以及在做的过程中发现一些问题(未解决!希望可以有大佬可以解释这个问题) 2.代码如下: <!DOCTYPE html> < ...
- Android Studio1.4.x JNI开发基础 - 简单实例
接上一篇,搭建好基于Android Studio的环境之后,编写native代码相对来说也比较简单了.在Android上编写Native代码和在Linux编写C/C++代码还是有区别,Native代码 ...
- 用了N年的接口,你知道接口是什么吗?——一个简单实例说明接口的伟大意义...
ASP.NET基础知识:简单的实例理解接口的伟大意义 WestGarden 2012-5-26 http://www.cnblogs.com/WestGarden/ 源代码:13033480群共享 首 ...
- 怎么获取上一个html网页传过来的值_爬虫:一个简单实例说明爬虫机制
爬虫,我的简单理解就是通过写定的程序,利用计算机的高速的优势,批量高效的获取数据的一种机制.通常我们访问网站是通过浏览器,而爬虫就是通过程序访问网站,也就是让程序伪装成浏览器进行访问. Reques ...
- JNI介绍及简单实例
JNI概念 JNI是Java Native Interface的缩写,中文为JAVA本地调用. 使用JNI, 可以调用用其他语言写成的库或程序, 尤其是C和C++. 好了,概念性的内容就不多介绍了, ...
最新文章
- postfix邮件服务器搭建
- 取消默认html打开文档,怎么取消mac默认打开文档方式
- websocketpp 只发送一次
- linux如何时间更新最新版本,桌面应用|Linux有问必答:如何更新过期版本的Ubuntu...
- LeetCode 多线程 1117. H2O 生成
- 【Python入门】第一个py程序
- oracle中如何创建dblink
- 数据挖掘-分类与预测-神经网络算法
- c++ msflexgrid 使用_丝杠支座组件C
- 运维工程师的生存法则
- IBM语音识别能力逼近人类水平,获深度学习巨头Yoshua Bengio盛赞
- sql 中WHERE字句中使用case when then
- 在 Ubuntu 18.04 上安装 Python 3.7
- Spring下载链接
- PMP考试中一些解题思路
- 极速office(Word)如何插入分数
- 【3】令人头疼—在安装pyenchant外部包时产生的意外事件
- 迪乐尼童鞋防骗子—常见网络骗子骗术防御要点
- 帆软报表列表_报表软件FineReport各类函数大全
- DM8168 Uboot使用EMAC1(TI源码使用默认的EMAC0)