JNI的初步介绍
2016-11-24 15:33
141 查看
什么是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的安全带来了隐患
相关文章推荐
- Java多线程--初步介绍
- JNI的环境搭建和简单的初步使用(2)
- Android Stdio初步使用介绍
- C++11多线程编程之初步介绍
- JNI的初步探索
- [Bada开发]初步入口函数介绍
- 区块链技术之区块链初步介绍
- Android中DRM mobile 1.0的初步介绍
- 新浪微博API使用初步介绍——解决回调地址的问题
- 动画—Core Animation初步学习一:Core Animation动画介绍
- Android开发之如何保证Service不被杀掉 这只是介绍少走弯路 必须用C/jni 实现守护进程 java是无法实现的
- JNI入门介绍
- Oracle传统基本体系结构初步介绍(5)
- Url 初步介绍
- 较详细的介绍JNI
- Fresco的初步介绍
- [ java ] JNI初步!
- JNI初体验,JNIEnv类型分析与介绍
- JNI 入门介绍(jstring与char*的转换)
- JNI学习初步