Android JNI Startup

没想到啊没想到,纯纯意义上自己写的第一个 Android APP Demo,竟然直接就是 JNI,Java 和 C 一起玩。

难怪别人都说,「为啥你每次学一个东西,都是从最难的开始学」

😂

获取 NDK

Android Native Development Kit (NDK) 是专门用来干「Android 调 C++」这个事儿的。

去「Tools > Android > SDK Manager」找到现在使用的 SDK,在里面勾选「Android NDK」,然后确定,等下载。

建项目

打开 Android Studio,新建项目,选择「Phone and Tablet」标签,拉到最后有个「Native C++」项目,选择之。

如果是旧版 Android Studio,需要在向导里面勾选「With C++ Support」选项。

然后跟着向导走,填名称,填包名,选语言(我选的是 Java…… Kotlin 真的是完全完全不会),选 API Level,就好了。

再下一步,选 C++标准,这里我选了「Toolchain Default」——反正最少选个 C++ 11 吧。即使这里选错了,后面好像改 CMakelists 就好了。

新增 C++函数

找到 MainActivaty 下面有个示例函数,点击后可导航到对应的 C++代码。

public native String stringFromJNI();

我们依葫芦画瓢,再写一个函数声明。

public native String helloWorld();

然后稍微等一会儿,稍等一会儿,等 IDE 自动感知,鼠标划过在左边显示行号的附近,会有个红色的灯泡。点击灯泡,选择「Create function Java_PackageName_MainActivity_helloWorld」。这样就在 C++文件里面生成了函数的框架。或者知道命名规律的话,也可以在 Java 那里写了声明之后,直接来 C++文件里面创建函数。不过——函数名是知道了,那么一大堆 Java 专有的类型呢…… 这个就懵逼了。所以,只管写 Java,然后让 IDE 自动生成吧。

这里我们直接

return env->NewStringUTF("Hello World!");

就好了。

我们重新审视一下 MainActivaty.java 这个文件。这里面最关键的是

static {
    System.loadLibrary("native-lib");
}

这里面定义了加载啥 CPP 文件——仔细看一下,你刚才写 C++代码的那个文件,是不是也叫这个名字?

最后我们来看 cpp/CMakelists.txt 这个文件。如果熟悉 CLion 的话,这个文件应该不会太陌生。对于我这种……啥都看不懂的,就说一下几个用得到的:

首先是开启 C++11/14/17 标准的支持:

set(CMAKE_CXX_STANDARD 17)

然后是,如果写的是 CV 相关的 APP 的话,可能在最后的 target_link_libraries 需要加上一句

-ljnigraphics

其他好像没什么坑,和普通的 CMakelists 一样——反正都不会。

调用第三方库(以 OpenCV 为例)

emm,自己的 Case 不是标准的 OpenCV,待先写一个 Demo 出来再补这一部分。

留下评论