首先检查配置环境,我这里使用的是AndroidStudio - 3.4.2 版本。打开SDK Tools,确保以下已经全部下载安装:

Android NDK报错怎么看_android

第二步,我们需要下载OpenCV资源,链接在此:https://opencv.org/opencv-3-2/,下载Android SDK,将下载后的sdk文件解压,

Android NDK报错怎么看_头文件_02

,打开文件OpenCv-android-sdk ->sdk -> native ->libs, 看到如下目录:

Android NDK报错怎么看_android_03

请留意 aimeabi 文件夹,我们将会拷贝到项目中。

接下来,就要开始撸代码了。新建一个Android Project,这个大家都会吧。

我的创建后目录如下(在这里,我们可能需要手动创建jniLibs 文件夹,然后将我们上述说到的aimeabi文件夹拷贝到这个文件夹里):

Android NDK报错怎么看_Android NDK报错怎么看_04

好,接下来进入代码阶段:

1. 新建一个类,声明一个helloWorld 的方法如下:

Android NDK报错怎么看_头文件_05

这个时候,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目录下就生成了我们想要的头文件:

Android NDK报错怎么看_Android NDK报错怎么看_06

打开头文件,我们发现,已经生成了我们对应的helloWorld的方法:

Android NDK报错怎么看_android_07

但此时,方法都还是不可用的,大家可以看到编译爆红,那么我们接下来做三步操作:

1)生成FirstNDK的具体实现类,新建c文件,firstndk.c 【此处切记,最好后缀是.c 的文件,很多博客或视频里都是 .h/.cp,最新的是使用.c 的,为避免不必要的麻烦,建议使用.c 】

Android NDK报错怎么看_头文件_08


代码如下,其中 #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文件

Android NDK报错怎么看_头文件_09

内容如下:

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交互的知识点就完成了。