1.JNI(Java Native Interface):

  它允许Java代码和其他语言写的代码进行交互,JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。下图是java与c的交互表现:

  

2.JNI的编写与编译流程:

  1)编写java文件,声名Native方法

  2)javac编译java文件

  3)javah -jni 编译生成Native方法的头文件

  4)用c/c++实现Native方法

  5)编译Native方法

  6)在JVM运行java程序

3.JNI数据类型:

4.简单的例子:

  1)vim TestJni.java

public class TestJni{
public native void print(String str);
static{
System.loadLibrary("MyJni");
}
public static void main(String[] args){
new TestJni().print("Hello jni");
}
}

  2)javac TestJni.java

  3)javah -jni MyJni   执行完后会生成MyJni.h文件

  4)vim TestJni.c

#include <MyJni.h>
#include<stdio.h>
/* Header for class TestJni */ #ifndef _Included_TestJni
#define _Included_TestJni
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: TestJni
* Method: print
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_TestJni_print
(JNIEnv *env, jobject obj, jstring str){
jchar *s=(jchar *)(*env)->GetStringUTFChars(env,str,NULL);
printf("content is %s\n",char *s);
ReleaseStringUTFChars(env,str,(const char*)s);
} #ifdef __cplusplus
}
#endif
#endif

  5)gcc -fPIC -shared -o libMyJni.so MyJni.c -I. -I/usr/local/jdk1.8.0_25/include/ -I/usr/local/jdk1.8.0_25/include/linux

  6) java TestJni

  如果出现没有找到lib可以用如下方法解决:

  -Djava.library.path=. TestJni 或

  export LD_LIBRARY_PATH=.

5.java对c传递的内容:

  1)JNIEnv:传递JNI运行的环境变量,该指针是运行在JVM当前的一个进程的句柄

  2)Jobject:Native的对象

6.JNI存在一些问题:

  1)可移植性较差

  2)数据映射存在一些问题

  3)不安全,在java回收过程中可能出现安全问题

最新文章

  1. ThinkPHP的URL访问
  2. ASP.NET中的chart控件绑定SQL Server数据库
  3. MEF入门之不求甚解,但力求简单能讲明白(三)
  4. MinHash算法
  5. 用Python写了个抓图小脚本
  6. 关于CSS3线型渐变这些事儿
  7. css中table tr:nth-child(even)改变tr背景颜色: IE7,8无效
  8. Windows 位图
  9. cellspacing与cellpadding
  10. 后台进程弹Toast的几种方案
  11. 用gogs轻松搭建个人的git服务器
  12. 递归与动态规划II-汉诺塔
  13. Gitbook 简介 使用总结 MD
  14. Spring框架学习05——AOP相关术语详解
  15. hbase源码系列(十五)终结篇&amp;Scan续集--&gt;如何查询出来下一个KeyValue
  16. springmvc实现json交互 -requestBody和responseBody
  17. ubuntu16.04下的htk安装编译
  18. Linux 日志切割工具cronolog详解
  19. linux中删除文件名称乱码
  20. NS3 使用NS3工具PyViz

热门文章

  1. C#中转义符
  2. IIS注册asp.net4.0
  3. linq.js的用法
  4. 【BZOJ 1492】 [NOI2007]货币兑换Cash 斜率优化DP
  5. CodeForces 167B - Wizards and Huge Prize 期望概率dp
  6. Death Note
  7. c++ 公有继承的赋值兼容规则
  8. 转:Spring-session &amp; redis 子域名共享session
  9. C++中的垃圾回收和内存管理
  10. 关于C++随机函数