NDK系列
一些定义:
NDK:Native Development Kit (原生开发工具包)
可以在Android 平台上开发和使用C/C++代码的工具包
JNI:Java Native Interface(java本地开发接口)
规定和约束了Java如何使用C/C++代码,使用C/C++代码可以提高一些算法效率,比如图像处理。
配置环境
下载ndk.png配置路径.png
创建java类和native方法
我们创建java类和native方法,且在MainActivity调用下
image.png
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("xfz", JniCalculator.getSum(1, 2) + "");
}
}
使用javah命令创建头文件
-
我们先看下javah的用法:
image.png - 生成头文件
-jni 是生成JNI样式的标准头文件,默认就开启
所以我们只需要cd到java目录下,输入命令:
javah -d ../jni/ com.jnidemo.jniutils.JniCalculator
即可在java同级目录下生成jni文件和头文件
生成头文件.png 头文件代码如下
#include <jni.h>
/* Header for class com_jnidemo_jniutils_JniCalculator */
#ifndef _Included_com_jnidemo_jniutils_JniCalculator
#define _Included_com_jnidemo_jniutils_JniCalculator
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_jnidemo_jniutils_JniCalculator
* Method: getSum
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_jnidemo_jniutils_JniCalculator_getSum
(JNIEnv *, jclass, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
实现C/C++代码
我们在jni目录下创建c++文件并引入头文件,并且实现头文件里的方法
#include "com_jnidemo_jniutils_JniCalculator.h"
extern "C" JNIEXPORT jint JNICALL Java_com_jnidemo_jniutils_JniCalculator_getSum
(JNIEnv *env, jclass, jint i, jint j) {
return (i + j);
}
创建makefile文件
android.mk 和 application.mk
image.png
//android.mk文件的代码
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := calculator
LOCAL_SRC_FILES := jni_calculator.cpp
include $(BUILD_SHARED_LIBRARY)
其中LOCAL_MODULE为生成的so包名,可以自定义
LOCAL_SRC_FILES为c++的文件名
//application.mk文件的代码
APP_ABI := all
APP_ABI为支持的架构
gradle关联android.mk
右键选择Link C++ Project with Gradle ,选择ndk-build,选择Android.mk进行关联
image.png
在app 的 build.gradle中的添加ndk
image.png
其中calculator就是Android.mk里的LOCAL_MODULE
生成so包
cd到jni目录,
输入ndk-build(需要先配置NDK环境变量)
image.png
生成libs,包含各个平台的so包
image.png
so包的使用
我们可以使用sourceSets进行引用,也可以直接放入jniLibs文件夹里
image.png
loadLibrary
最后我们在JniCalculator.java中去load C++生成库
public class JniCalculator {
static {
System.loadLibrary("calculator");
}
public static native int getSum(int i, int j);
}
成功输出
MainActivity里的Log.d("xfz", JniCalculator.getSum(1, 2) + "");
成功输出3
参考:https://blog.csdn.net/a469516684/article/details/86506411
网友评论