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. vue项目的脚手架

    > cnpm i @vue/cli@3 -g > vue create myapp * 选择 Manually select features ----- 自选预设文件 * 选择 vue ...

  2. onLaunch与onLoad同步获取用户数据

    前言 在开发项目的时候遇到从全局获取用户信息,逻辑是从app.js中的onLauch获取,page页面的onLoad拿到数据填充到页面.遇到的问题是onLauch与onLoad是异步的,没办法从页面判 ...

  3. linux CentOS7 nginx nginx-rtmp-module搭建直播

    直播配置 1. 安装 Nginx 依赖软件 yum -y install gcc gcc-c++ autoconf automake make yum -y install zlib zlib-dev ...

  4. oracle trim无效?

    这里说说如果是全角空格怎么去除 方法一 trim(TO_SINGLE_BYTE('aaa')) 方法二 SELECT TRIM(replace('aaa',' ','')) FROM dual

  5. plt.imshow()

    import matplotlib.pyplot as plt plt.imshow(digits.images[-1], cmap = plt.cm.gray_r) .imshow() Plotti ...

  6. oralce存储过程

    简单的存储 create or replace procedure sayhelloworld as begin dbms_output.put_line('Hello World'); end;

  7. php中的list()

    list()在php中上一个语言结构,并不是一个函数.类似array(),不过array()这个东西我们现在一般很少使用了,因为从php5.4版本开始,我们会直接使用[]来定义数组. 那么,list( ...

  8. Jmeter_Beanshell 返回值中提取参数值

    Jmeter_Beanshell  返回值中提取参数值[准备环境]: ①Jmeter版本:5.1,JDK:1.8 ②前置条件:将json.jar包置于..\apache-jmeter-5.1\lib\ ...

  9. jackson反序列化报错Unrecognized field , not marked as ignorable

    使用Jackson提供的json注解. @JsonIgnore注解用来忽略某些字段,可以用在Field或者Getter方法上,用在Setter方法时,和Filed效果一样.这个注解只能用在POJO存在 ...

  10. 更改package.js后重新加载

    node --save可有省略掉手动修改package.json的步骤   当你为你的模块安装一个依赖模块时,正常情况下你得先安装他们(在模块根目录下npm install module-name), ...