没想到啊没想到,纯纯意义上自己写的第一个 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 出来再补这一部分。
发表回复