博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JNI Hello World
阅读量:6855 次
发布时间:2019-06-26

本文共 2870 字,大约阅读时间需要 9 分钟。

   1、什么是JNI:

              JNI(Java Native Interface):java本地开发接口

 

              JNI是一个协议,这个协议用来沟通java代码和外部的本地代码(c/c++)
              外部的c/c++代码也可以调用java代码
       2、为什么使用JNI
              效率上 C/C++是本地语言,比java更高效
              代码移植,如果之前用C语言开发过模块,可以复用已经存在的c代码
              java反编译比C语言容易,一般加密算法都是用C语言编写,不容易被反编译
       3、Java基本数据类型与C语言基本数据类型的对应
              
       3、引用类型对应
              
       4、堆内存和栈内存的概念
              栈内存:系统自动分配和释放,
                      保存全局、静态、局部变量,
                      在站上分配内存叫静态分配,
                      大小一般是固定的
              堆内存:程序员手动分配(malloc/new)和释放(free/java不用手动释放,由GC回收),
                      在堆上分配内存叫动态分配,
                      一般硬件内存有多大堆内存就有多大
 
二、交叉编译
       1、交叉编译的概念
          交叉编译即在一个平台,编译出另一个平台能够执行的二进制代码
          主流平台有: Windows、 Mac os、 Linux
          主流处理器: x86、 arm、 mips
       2、交叉编译的原理
          即在一个平台上,模拟其他平台的特性
          编译的流程: 源代码-->编译-->链接-->可执行程序
       3、交叉编译的工具链
          多个工具的集合,一个工具使用完后接着调用下一个工具

在C中实现这个方法,在方法内部输出“Hello World",然后再回到Java中进行调用。分为以下步骤:

建立一个类:JNIDemo

 

public class JNIDemo {	static { 		/* 1. load */		System.loadLibrary("native"); /* libnative.so */ 	}	public native static void hello();	public native static int hello(String str, int []a);	public static void main(String[] args) {	 		 	System.out.println("JNIDemo");	 	/* 1. load */	 	System.loadLibrary("native"); /* libnative.so */	 	/* 2. map hello java<-->c c_hello */	 	/* 3. call */	 	hello();	 } }

 编译java

$ javac JNIDemo.java

 gen jiu java wenjian cahn sheng tou wenjian xie C wenjian

$  javah -jni JNIDemo

 

 Output JNIDemo.h

/* DO NOT EDIT THIS FILE - it is machine generated */#include 
/* Header for class JNIDemo */#ifndef _Included_JNIDemo#define _Included_JNIDemo#ifdef __cplusplusextern "C" {#endif/* * Class: JNIDemo * Method: hello * Signature: ()V */JNIEXPORT void JNICALL Java_JNIDemo_hello__ (JNIEnv *, jclass);/* * Class: JNIDemo * Method: hello * Signature: (Ljava/lang/String;[I)I */JNIEXPORT jint JNICALL Java_JNIDemo_hello__Ljava_lang_String_2_3I (JNIEnv *, jclass, jstring, jintArray);#ifdef __cplusplus}#endif#endif

 

new native.c

#include 
/* /usr/lib/jvm/java-1.7.0-openjdk-amd64/include/ */#include
#if 0 typedef struct { char *name; /* Java里调用的函数名 */ char *signature; /* JNI字段描述符, 用来表示Java里调用的函数的参数和返回值类型 */ void *fnPtr; /* C语言实现的本地函数 */} JNINativeMethod;#endifvoid c_hello(JNIEnv *env, jobject cls){ printf("Hello, world!\n");}static const JNINativeMethod methods[] = { {"hello", "()V", (void *)c_hello},};/* System.loadLibrary */JNIEXPORT jint JNICALLJNI_OnLoad(JavaVM *jvm, void *reserved){ JNIEnv *env; jclass cls; if ((*jvm)->GetEnv(jvm, (void **)&env, JNI_VERSION_1_4)) { return JNI_ERR; /* JNI version not supported */ } cls = (*env)->FindClass(env, "JNIDemo"); if (cls == NULL) { return JNI_ERR; } /* 2. map hello java<-->c c_hello */ if((*env)->RegisterNatives(env, cls, methods, 1) < 0) return JNI_ERR; return JNI_VERSION_1_4;}

 指定头文件路径 -I /usr/lib/jvm/java-1.7.0-openjdk-amd64/include/ 编译产生库

$   gcc -I /usr/lib/jvm/java-1.7.0-openjdk-amd64/include/ -fPIC  -shared -o libnative.so native.c

 

运行

$ java JNIDemo

 

结果

JNIDemoHello, world!

 

 

 

转载于:https://www.cnblogs.com/CZM-/p/7635484.html

你可能感兴趣的文章
Discuz!如何设置板块主题分类
查看>>
es6中class类的全方面理解(三)------静态方法
查看>>
如何在oracle 12c中创建普通用户
查看>>
面向对象问题归纳
查看>>
清除zencart分类页多页后面的&disp_order &sort字符串的方法
查看>>
二叉树递归遍历
查看>>
ThinkPHP 利用.htaccess文件的 Rewrite 规则隐藏URL中的 index.php
查看>>
Shiro 入门
查看>>
前端性能调优
查看>>
JavaScript prototype 属性
查看>>
XML操作类
查看>>
PTA_Have fun with numbers(C++)
查看>>
iOS日历显示农历信息
查看>>
win10系统配置java环境及遇到问题的一些处理方法
查看>>
记一次Selectable的误用
查看>>
动态规划略有所得 数字三角形(POJ1163)
查看>>
JavaScript中的常用编码
查看>>
HTML5 本地存储
查看>>
C#基础知识
查看>>
[网络流24题] 太空飞行计划 (最大权闭合子图---网络最大流)
查看>>