Android NDK开发简单入门

QuibblerQuibbler 2020-02-07 约 8 分钟 1676 次阅读

JNI开发

        看了看时间,整整折腾一天才跑成功一个demo。内心又几乎奔溃,Android这个NDK能不能别乱动,哪怕是就隔不到1年都不兼容了。Android最操蛋的也就是这个了,API不稳定。尽管官方已经极力的在维护,早干嘛去了。

Android一个重要的开发方向JNI开发,使用JNI接口可以完成Java代码对C/C++代码的调用,一般C/C++用来实现比较复杂的算法处理,比如图像、音视频的处理。这些用C/C++在底层运行速度比Java快多了。而且通用性比较强只需用C/C++写一份代码Java也可以直接调用。

        1、JNI加密不可破解,安全性比Java层高

        2、C/C++底层操作更容易

        3、C/C++效率更高,执行算法,视频处理等

        4、跨平台、可移植性强

1、NDK环境搭建

使用Androidstudio很简单,不像以前还得单独下载解压,现在都集成好了。没有直接下载就行了。

在项目中别忘了配置,右键项目,打开Open Module Settings,可能有些不会自动给你配置好NDK,需要手动设置版本,遇到问题先看看这里配置了没。

2、创建Native C++项目

最简单的方式,直接使用AndroidStudio的模板创建一个Native C++项目:

勾选默认的或者选一个C++14即可:

创建好的目录会自动生成一个示例native-lib.cpp以及一个编译CPP需要的CMakeLists.txt。

该项目的build.gradle中需要配置以下内容,CMakeLists.txt就是在src/main/cpp目录下

externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
            version "3.10.2"
        }
    }

3、创建JNI接口

既然知道上面的JNI项目结构,那么也可以在已有的项目中直接创建JNI接口。

①创建src/main/cpp目录

该文件夹用来存放C/C++源文件和CMake配置文件

②CMakeLists.txt

按照下面的标准格式,生成的库名,添加源文件,及其它配置

# 有关在Android Studio中使用CMake的更多信息,
# 请阅读文档:https://d.android.com/studio/projects/add-native-code.html
# 设置构建本机库所需的CMake最低版本。
cmake_minimum_required(VERSION 3.4.1)

# 创建并命名一个库,将其设置为STATIC或SHARED,并提供其源代码的相对路径。
# 您可以定义多个库,CMake会为您构建它们。 
# Gradle会自动将共享库与您的APK打包在一起。
add_library( # Sets the name of the library.
        hello
        # Sets the library as a shared library.
        SHARED
        # Provides a relative path to your source file(s).
        hello.cpp)
        
# 搜索指定的预构建库并将路径存储为变量。 
# 由于CMake默认情况下在搜索路径中包括系统库,
# 因此您只需要指定要添加的公共NDK库的名称即可。 
# CMake在完成其构建之前会验证该库是否存在。
find_library( # Sets the name of the path variable.
        log-lib
        # Specifies the name of the NDK library that
        # you want CMake to locate.
        log)
        
# 指定库CMake应该链接到您的目标库。 
# 您可以链接多个库,例如您在此构建脚本中定义的库,
# 预构建的第三方库或系统库。
target_link_libraries( # Specifies the target library.
        hello
        # Links the target library to the log library
        # included in the NDK.
        ${log-lib})

③build.gradle配置

加上这几行externalNativeBuild配置就行了

externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
            version "3.10.2"
        }
    }

④创建C/C++源文件

方法名一定要按照Java_包名_Activity名_函数名

#include <jni.h>
    #include <string>
    
    extern "C" JNIEXPORT jstring JNICALL
    Java_com_example_androidstudio_activity_other_NativeActivity_helloWorld(JNIEnv *env,jobject /* this */){
        std::string hello = "hello Quibbler";
        return env->NewStringUTF(hello.c_str());
    }

⑤Activity中声明native方法

public native String helloWorld();

⑥加载native库

libname就是C/C++源文件名

static {
        System.loadLibrary("hello");
    }

4、各种坑

一天尽遇到各种玄学大坑,难道这么多年都没人踩吗?我真是“锦鲤”,总能遇到各种问题。

4.1、CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage

去掉 app/build.gradle  ndk{} 里面的 'armeabi' 试试

试了,不管用。而且这个ndk{ }配置是不是已经废弃了,我添加到build.grable一堆报错,现在改用cmake{ }

相关推荐

精选
ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager
Android

ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager

ViewPager1、ViewPagerandroidx.viewpager.widget.ViewPager,Android中使用非常广泛的控件,可以说是APP必备:首次打开引导页、页面Banner广告等。常用方法:setAdapter() 设置适配器setOffscreenPageLimit() 设置缓存的页面个数,默认是 1setCurrentItem() 跳转到特定的页面setOnPage

1.1k
获取Android内置WebView内核版本
Android

获取Android内置WebView内核版本

获取Android内置WebView内核版本竟然能遇到这样奇葩的事情,网页用的技术过于新颖,以至于只支持高版本Chromium内核的,低版本安卓系统中内置的内核版本较低,无法加载前端页面。1、设置查看在系统设置里 > 应用 > 应用管理 > 显示系统应用,查看WebView组件:2、页面查看通过WebView发起的网络请求,都会带上浏览器的UA,通常页面都可以通过UA判断浏览器的内核版本。这里有两

1.1w
Android 14适配总结
Android

Android 14适配总结

Android 14适配总结毕业工作至今已经适配了三个Android大版本,从Android 11到Android 12、再到Android 13。2023年,Google即将推出的Android 14,上半年已经开始第一批适配。现在,第四个Android版本已经适配完,总结记录一下。1、Android 14计划Google一般会在2月份对外发布预告,同时放出开发者预览版。“拉通”各大平台、厂商以

1.1w