JNI小试牛刀
JNI:
JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支持就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的。例如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少要保证本地代码能工作在任何Java 虚拟机环境下。
应用:
First:
编写类,并添加native方法,不生命不说明具体实现。
ex:
package kg.tom;
public class MyJni { public native void display();
public native double sum(double x,double y);
static {
System.loadLibrary("sum");
} public static void main(String[] args) { new MyJni().display();
System.out.println(new MyJni().sum(2.0, 3.0)); } }
Second:
首先,javac命令编译类文件生成class字节码,javah命令根据class文件生成.h文件。
ex:

Third:
编写native C文件。
//必须的头文件jni.h
#include <jni.h> //如果没有设置jni.h的路径到Path,可以把其拷贝到c文件相同目录,修改为 #include “jni.h”
//导入我们需要实现的本地方法
#include "kg_tom_MyJni.h" //需要在c文件目录下
#include <stdio.h> JNIEXPORT void JNICALL Java_kg_tom_MyJni_display
(JNIEnv *env, jobject obj)
{
printf("Hello World tom!!");
return;
} JNIEXPORT jdouble JNICALL Java_kg_tom_MyJni_sum
(JNIEnv *env, jobject obj, jdouble a, jdouble b)
{
return a + b;
}
Four:
编译成可链接文件,Windows下编译成dll文件,Linux下编译成so文件。
gcc -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at -Id:/java/include –Id:/java/include/win32 -shared -o sum.dll java_sum_native.c
| 命令 | 简单介绍 |
| -Wall -D_JNI_IMPLEMENTATION_ | 把我们的C文件编译成dll |
| -Wl,--kill-at | 因为mingw默认是用@来进行分隔,会导致JNI机制不能读取,所以要删掉.. mingw官网解释 |
| Id:/java/include –Id:/java/include/win32 | 导入我们用的的jni需要的头文件…盘符,文件夹自己修改 |
| -shared -o | 输出配置,第一个参数为我们输出的名字(随便起),第二个参数为我们的C文件(随便起) |

Five:
运行JNI,把编译好的dll放到项目根目录,注意不是代码根目录。
执行效果:

JNI小试牛刀的更多相关文章
- Xamarin+Prism小试牛刀:定制跨平台Outlook邮箱应用(后续)
在[Xamarin+Prism小试牛刀:定制跨平台Outlook邮箱应用]里面提到了Microsoft 身份认证,其实这也是一大块需要注意的地方,特作为后续补充这些知识点.上章是使用了Microsof ...
- android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测
目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. (原创:转载声明出处:http://www.cnblogs.com/lin ...
- 【走过巨坑】android studio对于jni调用及运行闪退无法加载库的问题解决方案
相信很多小伙伴都在android开发中遇到调用jni的各种巨坑,因为我们不得不在很多地方用到第三方库so文件,然而第三方官方通常都只会给出ADT环境下的集成方式,而谷歌亲儿子android studi ...
- Android游戏开发实践(1)之NDK与JNI开发03
Android游戏开发实践(1)之NDK与JNI开发03 前面已经分享了两篇有关Android平台NDK与JNI开发相关的内容.以下列举前面两篇的链接地址,感兴趣的可以再回顾下.那么,这篇继续这个小专 ...
- JNI 备注
本文记录一个基础的JNI例子及过程中遇到的问题解决. 1.定义一个JAVA类如下: package jnidemo01; public class JniHello { public native v ...
- Android游戏开发实践(1)之NDK与JNI开发01
Android游戏开发实践(1)之NDK与JNI开发01 NDK是Native Developement Kit的缩写,顾名思义,NDK是Google提供的一套原生Java代码与本地C/C++代码&q ...
- Android游戏开发实践(1)之NDK与JNI开发02
Android游戏开发实践(1)之NDK与JNI开发02 承接上篇Android游戏开发实践(1)之NDK与JNI开发01分享完JNI的基础和简要开发流程之后,再来分享下在Android环境下的JNI ...
- 关于jni编译32位、64位动态库(Android.mk和Application.mk文件)
最近新项目需要编译64位的动态库,这里记录如何配置. 在jni目录下加入Android.mk和Application.mk文件. Application.mk APP_ABI := armeabi a ...
- android JNI 调用NDK方法
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
随机推荐
- KVM虚拟机建立快照
部分转载: http://blog.csdn.net/gg296231363/article/details/6899533 windows虚拟机默认镜像格式为raw,快照默认格式为qcow2.win ...
- python基础===装饰器@property 的扩展
以下来自Python 3.6.0 Document: class property(fget=None, fset=None, fdel=None, doc=None) Return a proper ...
- RemoteBox 1.6 发布,VirtualBox 管理工具
RemoteBox 1.6 发布,VirtualBox 管理工具 http://www.lupaworld.com/article-230113-1.html 安装VirtualBox Extensi ...
- 在linux下有没有什么软件可以连接windows上的MSSQL SERVER
在linux下有没有什么软件可以连接windows上的MSSQL SERVER GUI的http://dbeaver.jkiss.org/ http://bbs.csdn.net/topics/391 ...
- 访问dubbo没有权限,通过ip进行跳转服务器,并通过有权限服务器代理访问
#启动ip跳转 echo 1 > /proc/sys/net/ipv4/ip_forward vi /etc/sysctl.conf net.ipv4.ip_forward =1 sysctl ...
- SQL中char、nchar、varchar、nvarchar、text概述【转】
1. char char是定长的,也就是当你输入的字符小于你指定的数目时,char(8),你输入的字符小于8时,它会再后面补空值.当你输入的字符大于指定的数时,它会截取超出的字符. 2. nchar ...
- XML、java解释XML、XML约束
1.XML有什么用? (1)可以用来保存数据 (2)可以用来做配置文件 (3)数据传输载体 2.XML格式 XML 元素必须遵循以下命名规则: 名称可以含字母.数字以及其他的字符 名称不能以数字或者标 ...
- classpath中怎样一次性加入整个目录的jar文件
linux可以通过shell来处理 1 2 3 for jar in $HOME/lib/*.jar; do CLASSPATH=$CLASSPATH:$jar done
- python在windows下连接mysql数据库
一,安装MySQL-python python 连接mysql数据库需要 Python interface to Mysql包,包名为 MySQL-python ,PyPI上现在到了1.2.5版本.M ...
- web.config 数据库连接
方法一:connectionsStrings 首先配置web.config文件 <configurations> <connectionStrings> <add nam ...