JNI入门

 一、什么是JNI?
   Java Native Interface java本地接口
   提供了java与其他语言的通信接口,主要是Android中的c和c++,方便调用底层的一些功能强大的方法
   一句话总结就是,java代码调用c和c++代码。
 二、为什么使用JNI?
   1.效率
       java代码跨平台,虚拟机解释执行,不能执行操作硬件,虽然现在有了art模式,但是art模式安装应
体积会变大
       C代码直接操作硬件,效率高,而且我们可以自己手动释放内存
   2.优秀C和C++代码
       c和c++发展已经有好几十年,已经有了很多优秀的框架,比如ffmpeg-多媒体播放器;opencv-图形识
       别;7-zip压缩,这些都已经成形,可以直接用,不必要用java重新造轮子
   3.应用场景
       智能家居,车载电脑等等都需要我们来直接操作硬件
   4.特殊业务逻辑
       c和c++反编译困难,调试困难,java代码反编译简单,容易看懂;为了提高代码的安全性,可以用c
       和c++来开发一些比较重要的业务逻辑
 三、开发流程
   一般用ndk开发工具,工具可以在网上下载,工具使用可以参考ndk中docs文档,非常详尽
   流程:
   1.java中声明native方法
		public native String helloFromC();
   2.as中main目录下创建jni目录
   3.编写c代码,jni目录下创建.c文件,
	
jstring Java_com_itheima_hellojni_MainActivity_helloFromC(JNIEnv* env,jobject obj){
			char* str = "hello from c !!";
			//在jni规范里面 在jni环境的结构体里面
			//jstring     (*NewStringUTF)(JNIEnv*, const char*);
			//转化成了java的字符串
			return (*(*env)).NewStringUTF(env,str);
		}
		//Java_包名_类型_方法名(jvm虚拟机的指针,调用者对象)

   4.配置Android.mk文件,添加jni.h文件(ndk目录中有,选择适合自己的)
	
#指定编译的文件夹  指定当前文件目录
		LOCAL_PATH := $(call my-dir)
		#编译器会定义很多的临时变量,中间变量,最好清空所有的中间变量。
		include $(CLEAR_VARS)
		#编译出来模块的名称
		LOCAL_MODULE    := hello
		# 编译的源代码的名称
		LOCAL_SRC_FILES := hello.c
		
		#编译一个动态库,静态库
		#静态库 文件名.a   包含所有的函数并且函数运行的依赖,体积大,包含所有的API
		#动态库 文件名.so  包含函数,不包含函数运行的依赖,体积小,运行的时候,去操作系统寻找需要的API
		include $(BUILD_SHARED_LIBRARY)

   5.执行ndk-build.cmd编译c代码,生成动态库.so
   6.在java中把动态链接库加到jvm虚拟机
	
static{
			System.loadLibrary("库文件名称不带前缀,后缀名");
		}

	库文件名就是步骤4中的LOCAL_MODULE对应的名称
   7.像调用java一样调用native方法
 小结:一步一个脚印,慢慢学习

                
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值