jni的使用

一.什么是jni(what)

JNI : Java Native Interface java本地接口,实现让java和本地语言c/c++之间的相互调用。jni是一种协议,提供的一套编程框架。

二.为什么使用jni(why)

1.操作底层硬件,android手机上的传感器
2.程序的运行效率高,2d3d加速,音视频的解码
3.程序的安全性
4.复用本地开源项目,SQLite,OpenSSL,OpenGL,OpenCV,FFmpeg
5.复用公司之前本地项目

三如何使用jni

## jni开发流程 ##
* 1.新建模块,native声明本地方法,调用本地方法

	    //native声明一个本地方法,具体是由c来实现
	    public native String helloFromC();
	
	    public void click(View view){
	        Toast.makeText(this, helloFromC(), Toast.LENGTH_SHORT).show();
	    }

* 2.在module的build.gradle中defaultConfig 内添加ndk,写法如下.
	同步报错,点击setXXX 自动添加android.useDeprecatedNdk=true

	   defaultConfig {
	        applicationId "com.itheima.jnidemo"
	        minSdkVersion 15
	        targetSdkVersion 23
	        versionCode 1
	        versionName "1.0"
	
	        ndk{
	            moduleName "hello" //指定最终生成库名,最终生成的库文件名libhello.so
	        }
	
	    }

* 3.在调用本地方法的类中加载动态库,指定库名来加载

	    static {
	        System.loadLibrary("hello");//指定库名加载动态库
	    }
* 4.模块中new一个jni Folder文件夹,默认在main目录下
* 5.在jni文件夹下新建hello.c源文件,hello.h头文件(可选)
* 6.在hello.c源文件中按要求实现本地方法相应函数

		#include "hello.h"  //“”包含的头文件优先在当前目录下查找,如果没找到,再去系统头文件目录找
		#include <jni.h> //提供java和c的基本类型及引用类型对应,声明数据转换方法
		
		/**
		 *  本地方法相应的函数名:Java_包名_类名_本地方法名
		 * 参数1 JNIEnv *env jni环境,调用转换数据方法
		 * 参数2 jobject obj 调用本地方法类的对象
		*/
		jstring Java_com_itheima_jnidemo_MainActivity_helloFromC(JNIEnv *env, jobject obj){
		    char buf[] = "hello from c!";
		
		    //env : JNIEnv * <=> struct JNINativeInterface* *
		    //JNIEnv : struct JNINativeInterface*
		
		    //jstring     (*NewStringUTF)(JNIEnv*, const char*);
		
		    return (*env)->NewStringUTF(env, buf);
		}

* 7.gradle同步,make module
* 8.运行应用程序

## javah生成本地方法相应函数声明 ##
* 在main/java文件夹和com的同层目录中执行
		
		D:\jni02\code\JniDemo\calc\src\main\java>javah -classpath . -d ../jni com.itheima.calc.MainActivity

源码下载


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值