1、开发环境:操作系统Ubuntu,开发工具:android studio4.2.1。之前我在win10和MAC OS都有用过android studio,对比发现ubuntu版本的最友好。例如ubuntu版本不需要设置代理,SDK/NDK下载没有问题,速度非常快。android studio4.2.1版本智能很多,例如缺什么库在代码同步时会有提示,点击提示的链接自动下载,大大提升开发效率。
2、需在ubuntu上安装一个库,否则debug时会出现“Waitting for Debugger”的提示
sudo apt install libncurses5
3、新建一个Native C++工程,在搭好的框架下将c代码添加到cpp目录下
4、修改CMakeLists.txt,增加所有添加进来的源文件。我这为了图省事儿,头文件和c文件都放在同一个目录下了。
#源文件目录
aux_source_directory(. DIR_SRCS)
#下边这句也可以
#file(GLOB DIR_SRCS *.c *.cpp)
add_library( # Sets the name of the library.
rtlSdrAndroid
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
${DIR_SRCS} )
5、java类转jni的方法:在Android studio的external tools里创建一个增加java转jni头文件的(android studio安装时会自动装jdk,javah的路径可以用find . -name 'javah*'搜索到)
Program: javah的路径/javah
Argument: -classpath . -v -jni -d $SourcepathEntry$/../cpp $FileClass$
Working directory: $SourcepathEntry$
这样就可以通过右键点击java类,在弹出菜单中选择“external tools-->create jni”生成相应的jni头文件了。新生成的文件可能会提示一堆错误,比如jni.h找不到啥的,先不管,手工创建cpp源文件,实现jni头文件里的函数,然后同步即可,之前的错误就都消除了。
6、注意,由于既有c文件又有c++文件,头文件定义一定要加上:
#ifdef __cplusplus
extern "C" {
#endif
...
#ifdef __cplusplus
}
#endif
否则调用c函数编译时会出undefined reference to function的错误。