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出来再补这一部分。


评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注