JNI的初步介绍

来源:互联网 发布:淘宝网皮大衣 编辑:程序博客网 时间:2024/04/29 06:54

什么是jni

jni的全称是:java native interface, java本地接口
其实我们也可以将 JNI理解为一个协议 ,这个协议用来沟通java代码和外部的本地代码(c/c++)的,通过这个协议,java代码就可以调用外部的c/c++代码, 外部的c/c++代码也可以调用java代码,他就相当于是一个桥梁。

jni的开发流程

1、在java代码中声明一个native本地方法
public native String test();
2、在项目目录里边创建一个jni文件夹

3、在jni文件夹里面创建c文件,然后 按照规范写代码,这个规范可以参考ndk目录下的jni.h
比如上边我们需要返回一个字符串,则规范代码为:

#include <stdio.h>

#include *jni.h  //规范文件

代码解释:

jString:返回值
Java_com_deeny_jniDemo_MainActivity_test:大写Jave开头,下划线,完整的包名,下划线,方法名
env:jni接口的指针的指针

jobject:谁调用的这个方法,就是谁,比如当前是MainActivity调用的,那么当前的obj就是MainActivity的对象

jstring Java_com_deeny_jniDemo_MainActivity_test(JNIEnv* env,jobject obj){    char* str=“test!!!”;    //*env 是JNIEnv这个指针,需要拿到他里边的一个结构体对象,所以需要将其前边再加上一个*,具体可以参考jni.h    return (*(*env)).NewStringUTF(env,str);}

4、ndk-builder 指令编译
   编译前需要配置Android.mk文件
  
 //制定编译的文件夹,指定当前目录    LOCAL_PATH := $(call my-dir)    //编译器在编译的时候会生成很多临时变量,中间变量,最好是便宜之前先清空所有的临时变量    include $(CLEAR_VARS)    //编译完成的模块名    LOCAL_MODULE    := test    //编译的源文件    LOCAL_SRC_FILES := test.c    //编译一个动态库    //动态库:文件名.so  只包含运行的函数,不包含依赖,体积小,运行的时候会去系统寻找依赖    //静态库:文件名.a 包含所有的函数和函数运行的依赖,体积大,包含所有的api    include $(BUILD_SHARED_LIBRARY)


5、生成一个so动态库 放到libs里边
6、引入依赖库,通过静态代码块的形式引入

7、调用本地方法,和java调用普通方法一致

使用jni的优缺点

优点:提高了程序的性能,能够使java和其他语言进行交互
缺点:破坏了java的可移植性,也给java的安全带来了隐患





1 0
原创粉丝点击