JNI(Java Native Interface)

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语言基本数据类型的对应

 

JNI(Java Native Interface)

 

4.引用类型对应

JNI(Java Native Interface)

 

 4.1堆内存和栈内存的概念

栈内存:系统自动分配和释放,保存全局、静态、局部变量,在站上分配内存叫静态分配,

大小一般是固定的。

堆内存:程序员手动分配(malloc/new)和释放(free/java不用手动释放,由GC回收),在堆上分配内存叫动态分配, 一般硬件内存有多大堆内存就有多大。

  • 交叉编译

1、交叉编译的概念

交叉编译即在一个平台,编译出另一个平台能够执行的二进制代码

主流平台有: Windows、 Mac os、 Linux

主流处理器: x86、 arm、 mips

2、交叉编译的原理

即在一个平台上,模拟其他平台的特性

编译的流程: 源代码-->编译-->链接-->可执行程序

3、交叉编译的工具链

多个工具的集合,一个工具使用完后接着调用下一个工具

 4、常见的交叉编译工具

NDK(Native Development Kit): 开发JNI必备工具,就是模拟其他平台特性类编译代码的工具

CDT(C/C++ Development Tools): 是Eclipse开发C语言的一个插件,高亮显示C语言的语法Cygwin: 一个Windows平台的Unix模拟器(可以参考之前博客Cygwin简介及使用)

5、NDK的目录结构(可以在Google官网下载NDK开发工具,需要FQ)

docs: 帮助文档

build/tools:linux的批处理文件

platforms:编译c代码需要使用的头文件和类库

prebuilt:预编译使用的二进制可执行文件

sample:jni的使用例子

source:ndk的源码

toolchains:工具链

ndk-build.cmd:编译打包c代码的一个指令,需要配置系统环境变量

实验步骤

安装Java环境(jdk 64位)

安装C环境(MinGW64位)+dev编译工具

*Jdk字节数必须与MinGW对应

配置好dev项目环境

JNI(Java Native Interface)

 

  1. 编写java类, 类中有一个native方法。

JNI(Java Native Interface)

 

  1. 生成.class文件,生成.h文件。
  2. 编写方法的实现 HelloImpl.c

JNI(Java Native Interface)

 

  1. 生成.o文件,生成dll文件。

JNI(Java Native Interface)

 

.o文件转dll文件(代码):

gcc -Wl,--add-stdcall-alias -shared -o HelloImpl.dll HelloImpl.o

 

看代码的感受

JNI——结构体(即java中的类)的传入与设置——NativeMethod映射表

 

http://www.cnblogs.com/Miami/p/3716533.html?tdsourcetag=s_pctim_aiomsg(传结构体)

 

Java类:两个实体类(person和myinfo),一个Acitiviy组件类

JNI:

  头文件

assert.h 常用于防御式编程。防御式编程是提高软件质量技术的有益辅助手段。防御式编程的主要思想是:子程序应该不因传入错误数据而被破坏,哪怕是由其他子程序产生的错误数据。这种思想是将可能出现的错误造成的影响控制在有限的范围内。

 

*jfieldID

JAVA 支持两种 field(字段),每一个对象的实例都有一个对象字段的复制;所有的对象共享一个类的静态字段。

首先,通过在类引用上调用 GetFieldID 获取 field ID(字段ID)、字段名字和字段描述符:

Fid=(*env)->GetFieldID(env,cls,”s”,”Ljava/lang/String;”);

上例中的代码通过在对象引用obj上调用GetObjectClass获取到类引用。一旦获取到字段ID,

你就可以把对象和字段 ID作为参数来访问字段:

Jstr=(*env)->GetObjectField(env,obj,fid);

因为字符串和数组是特殊的对象,所以我们使用GetObjectField 来访问字符串类型的实例字段。

除了 Get/SetObjectField,JNI 还支持其它如 GetIntField、SetFloatField 等用来访问基本类型字段的函数。

  C文件

方法格式:JNIEXPORT 返回类型 JNICALL 方法名(JNIEnv *env, jobject clazz,所带参数)

 

 

 

JNI(Java Native Interface)

JNI(Java Native Interface)

JNI(Java Native Interface)