首先检查配置环境,我这里使用的是AndroidStudio - 3.4.2 版本。打开SDK Tools,确保以下已经全部下载安装:
第二步,我们需要下载OpenCV资源,链接在此:https://opencv.org/opencv-3-2/,下载Android SDK,将下载后的sdk文件解压,
,打开文件OpenCv-android-sdk ->sdk -> native ->libs, 看到如下目录:
请留意 aimeabi 文件夹,我们将会拷贝到项目中。
接下来,就要开始撸代码了。新建一个Android Project,这个大家都会吧。
我的创建后目录如下(在这里,我们可能需要手动创建jniLibs 文件夹,然后将我们上述说到的aimeabi文件夹拷贝到这个文件夹里):
好,接下来进入代码阶段:
1. 新建一个类,声明一个helloWorld 的方法如下:
这个时候,helloWorld 是没有具体实现的,因此,接下来我们将会实现这个C方法,并且交给Android 调用。
2. 打开AndroidStudio 的 终端命令窗口
根据自己的项目目录,通过cd命令进入到main 目录下,新建jni文件夹,用来存放C代码逻辑,然后cd进入java目录下。使用javah,生成关于helloWorld的头文件,我的命令行是这样的,car.wuba.com.myndk是包名,FirstNDK就是我们刚刚创建的类名:
javah -d ../jni/ car.wuba.com.myndk.FirstNDK
回车执行后,jni目录下就生成了我们想要的头文件:
打开头文件,我们发现,已经生成了我们对应的helloWorld的方法:
但此时,方法都还是不可用的,大家可以看到编译爆红,那么我们接下来做三步操作:
1)生成FirstNDK的具体实现类,新建c文件,firstndk.c 【此处切记,最好后缀是.c 的文件,很多博客或视频里都是 .h/.cp,最新的是使用.c 的,为避免不必要的麻烦,建议使用.c 】
代码如下,其中 #include "car_wuba_com_myndk_FirstNDK.h" 代表我们要实现的头文件对象
//
// Created by qingwei Liu on 2019-08-30.
//
#include "car_wuba_com_myndk_FirstNDK.h"
JNIEXPORT jstring JNICALL Java_car_wuba_com_myndk_FirstNDK_helloWorld
(JNIEnv *env, jclass jsclass1) {
return (*env)->NewStringUTF(env, "This is my first ndk");
}
2)配置app build.gradle 文件如下:
android {
compileSdkVersion 28
defaultConfig {
ndk {
moduleName "firstndk"
abiFilters "arm64-v8a", "armeabi-v7a", "x86"
}
3)新建Android.mk文件
内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_LDLIBS :=-llog
LOCAL_MODULE := firstndk
LOCAL_SRC_FILES := firstndk.c
include $(BUILD_SHARED_LIBRARY)
此时同步一下Project,那么接下来就是如何在Android调用我们刚刚生成的 helloWorld的方法了。
1)打开我们一开始创建的FirstNDK的java类,在静态代码块中添加loadLibrary的方法:
package car.wu.com.myndk;
public class FirstNDK {
static {
System.loadLibrary("firstndk");
}
public static native String helloWorld();
}
2)在Android中调用:
package car.wuba.com.myndk;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import car.wuba.com.myndk.jni.Hello;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String text = FirstNDK.helloWorld();
TextView tv = findViewById(R.id.tv_show);
tv.setText(text);
}
}
至此,我们的第一个Android 与 NDK交互的知识点就完成了。