Android进阶旅途中有一项用处相当广泛的技能——JNI开发。
什么是JNI呢?JNI允许Java类的某些方法原生实现,同时让它们能够像普通Java方法一样被调用和使用。这些原生方法也可以使用Java对象,使用方法与Java代码使用Java对象的方法相同。原生方法可以创建新的Java对象或者使用Java应用程序创建的对象,这些Java应用程序可以检查、修改和调用这些对象的方法以执行任务。
一、创建Java调用C/C++的方法
与普通的java方法相同,添加修饰符【native】修饰即可,如:public static native StringgetHelloStr();
二、生成头文件的两种方式
①命令行生成
1、利用Android Studio的Terminal,进入你Project的app/src/main/java目录下,例如(D:\windows\shareGitLib\NdkDemo\app\src\main\java),在Terminal中输入
cd app\src\main\java进入java目录;
2、运行指令: javah -jni 包名.类名,即可生成头文件。示例如下:
②利用External Tools生成
打开File->Settings->Tools->External Tools,点击 + 按照下图【创建生成头文件的工具02.jpg】创建工具:
其中Name/Description随便填,其余内容依次是:
Program:javah
Arguments:-v -jni -d $ModuleFileDir$/src/main/jni $FileClass$
Working directory:$SourcepathEntry$
点【OK】保存即可完成创建。
然后右键->External Tools->你创建的工具名,点击即可生成头文件。
三、创建JNI目录以及编写C/C++文件
①创建JNI目录
通过右键->New->Folder->JNI Folder创建JNI目录,并将上一步骤生成的.h头文件移到JNI目录下。
②创建Android.mk文件
文件内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := Java2C
LOCAL_SRC_FILES := Java2C.cpp
LOCAL_LDLIBS := -lm -llog
include $(BUILD_SHARED_LIBRARY)
------PS:两个需要更改的配置-------
LOCAL_MODULE -> 生成的so文件名
LOCAL_SRC_FILES -> 与Java交互的C/C++文件名,带扩展名
③创建与Java交互的C/C++文件
在C/C++文件中导入生成的.h头文件,然后将头文件中的方法拷贝到C/C++文件中,并将参数名补充完整:
PS:有些童鞋可能会遇到爆红的问题,可能是项目有没有支持C/C++的缘故,如何下载ndk并配置路径就不提了,配置好了之后,点击File->Link C++ Project with Gradle就可以了。
然后就可以直接run啦,打完收工。
惯例Github代码地址:https://github.com/LongAgoLong/NdkDemo