通过简单的示例开始使用 Android NDK
使用 Android Studio 2.2 和更高版本的 Native Development Kit(NDK)
,你可以使用它来编译 C 和 C++代码。
你可以通过手动下载 NDK 并构建它或通过 CMake 来使用 NDK。
在这里,我将给出手动安装 NDK 和示例代码的流程,
根据你的系统操作系统,你可以从此位置下载 NDK :https://developer.android.com/ndk/downloads/index.html 。
下载后,将系统环境变量中的路径作为变量名称NDK_PROJECT_PATH和变量值“NDK 存储路径的位置”。
-
接下来,在创建新的 android 项目之后,将 NDK 与 Android Studio 集成,
在 gradle - 本地属性中添加 sdk 路径的位置
sdk.dir=F\:\\gowtham\\Android\\sdk
和
android.useDeprecatedNdk = true
-
然后,按 Build - Make Project(Ctrl + f9)。
你的项目将成功构建,并将在消息 gradle 构建中获得 BUILD SUCCESFUL,如下所示
然后在终端中,它最初将包含项目的路径
添加 cd app/src/main
路径将从项目路径扩展到 main。
接下来,再次构建 - 制作项目(Ctrl + f9)。
现在你将在 app-build-intermediates-classes-debug 文件夹下找到,如下所示。
现在,在 app / src / main / java 下创建一个新的 Java 类文件,在这里我创建了一个名为 NativeClass 的 java 文件
编写一个简单的调用函数,函数名称和函数输入,这里我写了函数作为例子,给它两个整数输入,
再次构建项目 (Ctrl + f9) ,
在构建时,你会发现在这样的构建下创建的类文件,
Then,in terminal
`-Javah -d jni –classpath ../../build/intermediates/classes/debug`application.com.ndkapplication.NativeClass
其中, - d - 用于输出目录 - jni -Generate JNI 样式头文件(默认) - 类路径 - 为其加载类
现在构建项目(Ctrl + f9),你将找到创建的 jni 文件夹,并且将创建一个**头文件,**其中包含你在终端中指定的名称,如下所示
现在复制头文件并保存为 jni 文件夹中头文件同名的 .cpp 或 .c 文件。
我创建了一个 cpp 文件,如下所示
Delete everything before **JNIEXPORT line** in this file and **add header file name** alone.
Here I am for simple example just adding two numbers and returning value to android java.
Application_com_ndkapplication_NativeClass.cpp
#include <application_com_ndkapplication_NativeClass.h>
JNIEXPORT jint JNICALL Java_application_com_ndkapplication_NativeClass_example
(JNIEnv *, jclass , jint as , jint bs){
return (as + bs);
}
对于此示例,无需在其头文件中添加任何函数。
在 Jni 文件夹中创建名为 Android.mk 和 Application.mk 的新文件
Android.mk 文件用于描述构建系统的源代码。
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := application_com_ndkapplication_NativeClass.cpp
LOCAL_LDLIBS += -llog
LOCAL_MODULE := exp-jni
include $(BUILD_SHARED_LIBRARY)
要了解此文件的详细信息,请阅读此链接 https://developer.android.com/ndk/guides/android_mk.html
Application.mk,描述了你的应用所需的本机模块。
Application.mk
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti –fexceptions
APP_ABI := armeabi-v7a armeabi arm64-v8a mips mips64 x86 x86_64
APP_PLATFORM := android-16
要了解此文件的详细信息,请阅读此链接 https://developer.android.com/ndk/guides/application_mk.html
Now build the project again **(Ctrl + f9)**, you will find the **armeabi-v7a, armeabi, arm64-v8a ,mips, mips64, x86 and x86_64** folder created inside jniLibs.
然后,在 main 活动中传递输入并获取本机类文件的输出。
int a = 5, b = 5, res ;
res = NativeClass.example(((int) a),((int) b));
TextView textView = (TextView) this.findViewById(R.id.tv);
textView.setText(new Integer(res).toString());
这里我通过 a,b 给出了两个整数输入,并从变量 res 获得输出。
并通过传递给 TextView 在屏幕上显示获得的输出。
并且不要忘记将你在 Android.mk 文件中指定的库添加为 **LOCAL_MODULE,**如下所示,
static {
System.loadLibrary("exp-jni");
}
最后再次构建项目(Ctrl + f9),你将找到在每个 armeabi-v7a,armeabi,arm64-v8a,mips,mips64,x86 和 x86_64 文件夹下创建的 .so 文件。
然后现在运行应用程序,你将获得此示例的输出为 10。
这是 NDK 初学者的基本程序,可以在这里导入 OpenCV 库,也可以进行图像处理应用程序。