美文网首页
NDK在Android Studio下的开发(ndk-build

NDK在Android Studio下的开发(ndk-build

作者: 许方镇 | 来源:发表于2020-03-28 18:09 被阅读0次

    NDK系列

    1. ndk-build
    2. CMake
    3. 编辑ffmpeg

    一些定义:

    NDK:Native Development Kit (原生开发工具包)
    可以在Android 平台上开发和使用C/C++代码的工具包

    JNI:Java Native Interface(java本地开发接口)
    规定和约束了Java如何使用C/C++代码,使用C/C++代码可以提高一些算法效率,比如图像处理。

    配置环境

    下载ndk.png
    配置路径.png

    创建java类和native方法

    我们创建java类和native方法,且在MainActivity调用下


    image.png
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            Log.d("xfz", JniCalculator.getSum(1, 2) + "");
        }
    }
    

    使用javah命令创建头文件

    1. 我们先看下javah的用法:


      image.png
    2. 生成头文件
      -jni 是生成JNI样式的标准头文件,默认就开启
      所以我们只需要cd到java目录下,输入命令:
      javah -d ../jni/ com.jnidemo.jniutils.JniCalculator
      即可在java同级目录下生成jni文件和头文件
      生成头文件.png 头文件代码如下
    #include <jni.h>
    /* Header for class com_jnidemo_jniutils_JniCalculator */
    
    #ifndef _Included_com_jnidemo_jniutils_JniCalculator
    #define _Included_com_jnidemo_jniutils_JniCalculator
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     com_jnidemo_jniutils_JniCalculator
     * Method:    getSum
     * Signature: (II)I
     */
    JNIEXPORT jint JNICALL Java_com_jnidemo_jniutils_JniCalculator_getSum
      (JNIEnv *, jclass, jint, jint);
    
    #ifdef __cplusplus
    }
    #endif
    #endif
    

    实现C/C++代码

    我们在jni目录下创建c++文件并引入头文件,并且实现头文件里的方法

    #include "com_jnidemo_jniutils_JniCalculator.h"
    
    extern "C" JNIEXPORT jint JNICALL Java_com_jnidemo_jniutils_JniCalculator_getSum
            (JNIEnv *env, jclass, jint i, jint j) {
        return (i + j);
    }
    

    创建makefile文件

    android.mk 和 application.mk


    image.png
    //android.mk文件的代码
    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE    := calculator
    LOCAL_SRC_FILES := jni_calculator.cpp
    include $(BUILD_SHARED_LIBRARY)
    

    其中LOCAL_MODULE为生成的so包名,可以自定义
    LOCAL_SRC_FILES为c++的文件名

    //application.mk文件的代码
    APP_ABI := all
    

    APP_ABI为支持的架构

    gradle关联android.mk

    右键选择Link C++ Project with Gradle ,选择ndk-build,选择Android.mk进行关联


    image.png

    在app 的 build.gradle中的添加ndk


    image.png
    其中calculator就是Android.mk里的LOCAL_MODULE

    生成so包

    cd到jni目录,
    输入ndk-build(需要先配置NDK环境变量)


    image.png

    生成libs,包含各个平台的so包


    image.png

    so包的使用

    我们可以使用sourceSets进行引用,也可以直接放入jniLibs文件夹里


    image.png

    loadLibrary

    最后我们在JniCalculator.java中去load C++生成库

    public class JniCalculator {
    
        static {
            System.loadLibrary("calculator");
        }
    
        public static native int getSum(int i, int j);
    
    }
    

    成功输出

    MainActivity里的Log.d("xfz", JniCalculator.getSum(1, 2) + "");成功输出3

    image.png

    参考:https://blog.csdn.net/a469516684/article/details/86506411

    其他

    相关文章

      网友评论

          本文标题:NDK在Android Studio下的开发(ndk-build

          本文链接:https://www.haomeiwen.com/subject/ypgjuhtx.html