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回收过程中可能出现安全问题

JNI基础学习的更多相关文章

  1. [ 转载 ] Android JNI(一)——NDK与JNI基础

    Android JNI(一)——NDK与JNI基础 隔壁老李头 关注  4.4 2018.05.09 17:15* 字数 5481 阅读 11468评论 8喜欢 140 本系列文章如下: Androi ...

  2. Android JNI(一)——NDK与JNI基础

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  3. [原]零基础学习SDL开发之在Android使用SDL2.0显示BMP图

    关于如何移植SDL2.0到安卓上面来参考我的上一篇文章:[原]零基础学习SDL开发之移植SDL2.0到Android 在一篇文章我们主要使用SDL2.0来加载一张BMP图来渲染显示. 博主的开发环境: ...

  4. [原]零基础学习SDL开发之在Android使用SDL2.0显示BMP叠加图

    关于如何移植在android上使用SDL,可以参考[原]零基础学习SDL开发之移植SDL2.0到Android 和 [原]零基础学习SDL开发之在Android使用SDL2.0显示BMP图 . 在一篇 ...

  5. 【音视频连载-001】基础学习篇- SDL 介绍以及工程配置

    技术开发故事会连载 这是音视频基础学习系列的第一篇文章,主要讲解 SDL 是什么以及为什么要用到它,看似和音视频没啥卵关系,其实必不可少. SDL 简介 SDL 是 "Simple Dire ...

  6. salesforce 零基础学习(五十二)Trigger使用篇(二)

    第十七篇的Trigger用法为通过Handler方式实现Trigger的封装,此种好处是一个Handler对应一个sObject,使本该在Trigger中写的代码分到Handler中,代码更加清晰. ...

  7. 如何从零基础学习VR

    转载请声明转载地址:http://www.cnblogs.com/Rodolfo/,违者必究. 近期很多搞技术的朋友问我,如何步入VR的圈子?如何从零基础系统性的学习VR技术? 本人将于2017年1月 ...

  8. IOS基础学习-2: UIButton

    IOS基础学习-2: UIButton   UIButton是一个标准的UIControl控件,UIKit提供了一组控件:UISwitch开关.UIButton按钮.UISegmentedContro ...

  9. HTML5零基础学习Web前端需要知道哪些?

    HTML零基础学习Web前端网页制作,首先是要掌握一些常用标签的使用和他们的各个属性,常用的标签我总结了一下有以下这些: html:页面的根元素. head:页面的头部标签,是所有头部元素的容器. b ...

随机推荐

  1. Codeforces Round #401 (Div. 1) C(set+树状数组)

    题意: 给出一个序列,给出一个k,要求给出一个划分方案,使得连续区间内不同的数不超过k个,问划分的最少区间个数,输出时将k=1~n的答案都输出 比赛的时候想的有点偏,然后写了个nlog^2n的做法,T ...

  2. [洛谷P2657][SCOI2009]windy数

    题目大意:不含前导零且相邻两个数字之差至少为$2$的正整数被称为$windy$数.问$[A, B]$内有多少个$windy$数? 题解:$f_{i, j}$表示数有$i$位,最高位为$j$(可能为$0 ...

  3. [洛谷P4015]运输问题

    题目大意:有m个仓库和n个商店.第i个仓库有 $a_{i}$ 货物,第j个商店需要$b_{j}$个货物.从第i个仓库运送每单位货物到第j个商店的费用为$c_{i,j}$​​.求出最小费用和最大费用 题 ...

  4. vim插件修改背景颜色和代码颜色

    ls /usr/share/vim/vim74/colorsblue.vim default.vim desert.vim evening.vim morning.vim pablo.vim READ ...

  5. Codeforces Round #487 (Div. 2) A Mist of Florescence (暴力构造)

    C. A Mist of Florescence time limit per test 1 second memory limit per test 256 megabytes input stan ...

  6. java 多线程 原子性

    原子性 原子性:原子操作是不能被线程调度机制中断的操作,一旦操作开始,那么它就一定可以在可能发生的“上下文切换”之前(切换到其他线程执行)执行完毕. 依赖原子性是很棘手且很危险的,除非你是并发专家,否 ...

  7. Sqlserver面试题

    1.用一条SQL语句 查询出每门课都大于80分的学生姓名 name   kecheng   fenshu 张三     语文       81张三     数学       75李四     语文   ...

  8. vue相对路径修改

    如果静态文件不是部署在网站根目录下,vue-cli将给你造成巨大的麻烦. 你不能直接把build好的文件抛进一个目录.你不能直接在本地打开用vue做好的静态网站. 改成相对路径,主要需要做两步. 1. ...

  9. HDU2553 N皇后问题---(dfs)

    http://acm.hdu.edu.cn/showproblem.php?pid=2553 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在 ...

  10. HDU2389(二分图匹配Hopcroft-Carp算法)

    Rain on your Parade Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 655350/165535 K (Java/Ot ...