安卓 NDK与JNI

本文详细介绍了Android NDK的用途,包括保护代码、利用C/C++库和提高执行效率,并探讨了JNI作为Java调用Native代码的机制。同时,讲解了使用NDK的优缺点,以及JNI的数据类型和异常处理特性。此外,还阐述了一个使用JNI的Android工程的项目结构,包括jni文件夹、Android.mk、Application.mk和本地接口文件的角色和功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、简介

        Android NDK(Native Development Kit)是一套开发工具,允许Android应用嵌入由C/C++源代码编译来的本地代码(绕过Dalvik虚拟机),通过JNI(Java Native Interface)调用。JNI和Android没有关系,只是一种Java调用Native的机制,第三方应用可以使用JNI完成自己的C动态链接库(.so文件),但只是把.so文件放到文件系统的特定位置,而如果想把.so文件和.apk打包,则需要NDK。

        使用NDK有如下优点:1)保护代码,因为apk的java层代码容易被反编译,而C/C++库反编译较难;2)可以方便使用现存的开源库,因为其大部分都是用C/C++编写的;3)算法使用C/C++开发,可以提高程序执行效率;4)便于移植。但使用NDK会增加程序的复杂性,除非必须提高性能或使用第三方库,否则Google不建议使用NDK。

        JNI提供了一个在Java平台上调用C/C++的一种途径,与其他类似接口(如Netscape Java运行接口)相比,JNI在设计之初就确保了二进制的兼容性(允许一个程序在不改变其可执行文件的条件下在不同的编译环境中工作),因而JNI编写的应用程序兼容所有Java虚拟机。JNI有自己的原始数据类型和数据引用类型,如下表和下图。

                

                

        JNI不会检查NullPointerException这样的错误,因为这会导致性能下降。JNI允许使用Java异常处理,大部分JNI方法会返回错误代码但本身并不会报出异常。Android系统不能停止JNI创建的线程,即使GC(Garbage Collection)在运行释放内存是也不行,直到调用DetachCurrentThread方法,该线程才会从Java虚拟机脱离。

二、JNI项目结构

        一个使用JNI的Android工程的项目结构如图:

                

        与一般的Andioid工程相比,其多了一个jni文件夹,所有本地代码都存储在这个文件夹内。在这个文件夹内,除了包含所有编译的C/C++源代码文件(头文件和源文件)外,主要还包含Android.mk、Application.mk两个文件和本地接口文件。

        Android.mk是编译本地项目的makefile,其把代码按照模块进行划分,把静态库拷贝到项目的libs文件夹,生成共享库和独立的可执行文件。开发人员可以在Android.mk文件中配置LOCAL_PATH、LOCAL_MODULE、LOCAL_SRC_FILES等。Application.mk文件用来存储编译参数,其也是一个makefile文件,通过配置APP_STL等变量让编译更加灵活。

        本地接口文件是Java与Native的接口,包含C/C++的接口函数,这些函数与普通的C函数有几点不同:1)这些方法的返回值类型和参数类型必须是JNI本地类型或引用类型,否则Java无法成功调用这些函数;2)这些函数的命名规则必须是Java_xxx_MethodName,xxx表示调用JNI方法的类的全名(package+classname),只是中间将“.”换成了下划线“_”,MethodName是在Java中调用的实际方法名;3)这些函数的头两个参数必须是JNIEnv*型参数和jobject型参数,前者表示JNI的调用环境,后者表示定义native方法的Java类的对象本身。在实现这些接口函数时还需使用JDK的javah工具生成相应的头文件。

        在写完上述文件并配置好编译环境后,NDK编译系统会编译出一个.so文件放在libs相应的文件夹下,本设计的Android采用armeabi处理器架构,所以.so文件放在armeabi文件夹中。最后,程序若想调用NDK程序,在相应Java类中调用接口方法时加上“native”关键字,这样编译器就知道这是JNI的入口点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值