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 <jni.h>
/* Header for class JNIDemo */ #ifndef _Included_JNIDemo
#define _Included_JNIDemo
#ifdef __cplusplus
extern "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 <jni.h>	/* /usr/lib/jvm/java-1.7.0-openjdk-amd64/include/ */
#include <stdio.h> #if 0
typedef struct {
char *name; /* Java里调用的函数名 */
char *signature; /* JNI字段描述符, 用来表示Java里调用的函数的参数和返回值类型 */
void *fnPtr; /* C语言实现的本地函数 */
} JNINativeMethod;
#endif void c_hello(JNIEnv *env, jobject cls)
{
printf("Hello, world!\n");
} static const JNINativeMethod methods[] = {
{"hello", "()V", (void *)c_hello},
}; /* System.loadLibrary */
JNIEXPORT jint JNICALL
JNI_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

结果

JNIDemo
Hello, world!

JNI Hello World的更多相关文章

  1. android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测

    目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. (原创:转载声明出处:http://www.cnblogs.com/lin ...

  2. 【走过巨坑】android studio对于jni调用及运行闪退无法加载库的问题解决方案

    相信很多小伙伴都在android开发中遇到调用jni的各种巨坑,因为我们不得不在很多地方用到第三方库so文件,然而第三方官方通常都只会给出ADT环境下的集成方式,而谷歌亲儿子android studi ...

  3. Android游戏开发实践(1)之NDK与JNI开发03

    Android游戏开发实践(1)之NDK与JNI开发03 前面已经分享了两篇有关Android平台NDK与JNI开发相关的内容.以下列举前面两篇的链接地址,感兴趣的可以再回顾下.那么,这篇继续这个小专 ...

  4. JNI 备注

    本文记录一个基础的JNI例子及过程中遇到的问题解决. 1.定义一个JAVA类如下: package jnidemo01; public class JniHello { public native v ...

  5. Android游戏开发实践(1)之NDK与JNI开发01

    Android游戏开发实践(1)之NDK与JNI开发01 NDK是Native Developement Kit的缩写,顾名思义,NDK是Google提供的一套原生Java代码与本地C/C++代码&q ...

  6. Android游戏开发实践(1)之NDK与JNI开发02

    Android游戏开发实践(1)之NDK与JNI开发02 承接上篇Android游戏开发实践(1)之NDK与JNI开发01分享完JNI的基础和简要开发流程之后,再来分享下在Android环境下的JNI ...

  7. 关于jni编译32位、64位动态库(Android.mk和Application.mk文件)

    最近新项目需要编译64位的动态库,这里记录如何配置. 在jni目录下加入Android.mk和Application.mk文件. Application.mk APP_ABI := armeabi a ...

  8. android JNI 调用NDK方法

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  9. jni操作jobject

    一. 注册JNI函数 1.         静态方法 一般使用javah进行编译,生成很长的文件名和函数名字,这个书写不方便,影响运行效率. 2.         动态注册 使用JNINativeMe ...

  10. JNI开发的常见错误

    1. 写错了load的library java.lang.UnsatisfiedLinkError: Couldn't load hell0: findLibrary returned null 2. ...

随机推荐

  1. js转换成布尔类型boolean

    /** * js转换成布尔值 * a.转换方法:Boolean(var) * b.数字转换成布尔,除了0与NaN,其余都是true * c.字符串转换成布尔,除了空串"",其余都是 ...

  2. web前端架构师学习流程

    JavaScript 开发(高级) 系统知识 1.1ECMAScript标准的发展过程,ES6语言对JavaScript的改进: 1.2ES6中语法层面的新特性(let.const.参数扩展.模块化等 ...

  3. Linux学习笔记之认识与学习Bash

    什么是shell:shell是一个翻译器,将所敲的命令翻译成CPU能理解的语言,之后CPU再去执行,CPU执行后返回给shell,shell再翻译成我们所能理解的语言并显示:终端并不是shell,而是 ...

  4. Pandas_key_point

    10分钟快速入门pandas: http://pandas.pydata.org/pandas-docs/stable/10min.html ----------------------------- ...

  5. eclipse设置tomcat部署目录地址

    参考: https://blog.csdn.net/lvyuan1234/article/details/53418818 右键,open 操作前提是所有项目移除,并且右键clean掉相关数据! 修改 ...

  6. eclipse导入工程时出现大红色感叹号(转)

    转载文章:http://blog.csdn.net/xiaotaibai2008/article/details/6365334 因为也遇到了同样的问题,所以google了以下,希望对于我这个小菜鸟有 ...

  7. 有关JWT(Json Web Token)的那些事

    用户认证是计算机安全领域一个永恒的热点话题,然而你会发现,开发者很少讨论有关Json Web Token的话题,其实使用Json Web Token集成到API身份验证机制中是容易,本文给大家普及基础 ...

  8. svm 之 线性可分支持向量机

    定义:给定线性可分训练数据集,通过间隔最大化或等价的求解凸二次规划问题学习获得分离超平面和分类决策函数,称为线性可分支持向量机. 目录: • 函数间隔 • 几何间隔 • 间隔最大化 • 对偶算法 1. ...

  9. ylbtech-公司-滴滴出行:滴滴出行

    ylbtech-公司-滴滴出行:滴滴出行 滴滴出行是涵盖出租车. 专车.  滴滴快车.  顺风车. 代驾及 大巴等多项业务在内的一站式出行平台,2015年9月9日由“滴滴打车”更名而来. 2月1日起, ...

  10. Sublime text 3 3103 注册码(2016.2.9更新)

    Sublime text 3 (Build 3103) license key,these all tested available on 2016/02/10 .Feel free to enjoy ...