美文网首页Android
android ndk 开发2

android ndk 开发2

作者: 客观开发者 | 来源:发表于2022-06-13 08:27 被阅读0次

    前言

    看android ndk 1 版本。

    生成so库

    先配置你需要生成的CPU架构,在build.gradle中增加配置项。

    externalNativeBuild {
                cmake {
                    cppFlags ''
                    abiFilters "arm64-v8a", "armeabi-v7a"
                }
            }
    

    android studio编译armeabi动态库环境版本
    1.环境配置
    android studio version:3.6.3
    gradle-wapper.properties:4.10.1
    ndk:r16b
    sdk:28.0.3
    jdk:1.8

    model根目录build.gradle

    externalNativeBuild{
                cmake {
    //                arguments "-DANDROID_TOOLCHAIN=gcc",  // 为什么添加此条命令会影响编译结果???
    //                        "-DANDROID_STL=stlport_static",
                     arguments "-DANDROID_ARM_MODE=arm"
    //                        "-DANDROID_PLATFORM=android-19"
                }
                cmake {
                    ndk {
                        abiFilters "armeabi"
                    }
                }
            }
    

    项目根路径build.gradle:

    dependencies{
      classpath "com.android.tools.build:gradle:3.3.2"
      }
    

    国内仓库路径:
    项目根路径下的build.gradle添加仓库

     maven {
                url 'https://maven.aliyun.com/repository/google/'
            }
            maven {
                url 'https://maven.aliyun.com/repository/jcenter/'
            }
            maven { url 'https://jitpack.io' }
    
    

    这样写就是为了 降低版本就可以了。。

    调试打断点和打印log

    Android C++层
    1.#include <log/log.h>

    ALOGV(“Running %s in=%s out=%s\n”, dex2oat_bin, relative_input_file_name, output_file_name);
    

    2.#include <android-base/logging.h>

    LOG(WARNING) << “File " << elf_filename << " loaded with dlopen but cannot find its mmaps.”;
    

    3.#include <android/log.h>

    __android_log_print(ANDROID_LOG_INFO, TAG, “AudioPlayer::RealizePlayer()”);
    

    4.#include <async_safe/log.h>

    async_safe_format_log(ANDROID_LOG_ERROR, “libc”, “Access denied adding property “%s””, name);
    
    image.png

    断点还不行。

    不知道为什么是灰色的


    image.png

    错误信息
    The breakpoint will not currently be hit. No executable code is associated with this line.

    ndk bitmap 处理

    使用

    include <android/bitmap.h>
    里面的方法,必须t添加下面的,否则会报错。

    在CMakeLists.txt文件的target_link_libraries节点中加入jnigraphics

    target_link_libraries( ImageProc1
                           #加入该依赖库
                           jnigraphics
                           ${log-lib} ) 
    

    图片黑色处理

    
    /**
     *
     * 图片-灰色-处理
     *
     */
    extern "C"
    JNIEXPORT void JNICALL Java_com_example_app_CppUtils_imgToGray(
            JNIEnv *env, jobject thiz, jobject bitmap) {
        if (bitmap == NULL) {
            __android_log_print(ANDROID_LOG_ERROR, TAG, "bitmap is null");
            return;
        }
    
        AndroidBitmapInfo bitmapInfo;
        /*用 AndroidBitmap_getInfo() 函数从位图句柄(从JNI得到)获得信息(宽度、高度、像素格式)*/
        AndroidBitmap_getInfo(env, bitmap, &bitmapInfo);
    //    int h = bitmapInfo.height;
    //    int w = bitmapInfo.width;
        void *pixels = NULL;
        /*用 AndroidBitmap_lockPixels() 对像素缓存上锁,即获得该缓存的指针。*/
        /*不能没有这个*/
        AndroidBitmap_lockPixels(env, bitmap, &pixels);
    
        // From top to bottom
        int x = 0, y = 0;
        for (y = 0; y < bitmapInfo.height; ++y) {
            // From left to right
            for (x = 0; x < bitmapInfo.width; ++x) {
                int a = 0, r = 0, g = 0, b = 0;
                void *pixel = NULL;
                // Get each pixel by format
    
                if (bitmapInfo.format == ANDROID_BITMAP_FORMAT_RGBA_8888) {
                    pixel = ((uint32_t *) pixels) + y * bitmapInfo.width + x;
                    int r, g, b;
                    uint32_t v = *((uint32_t *) pixel);
                    r = RGB8888_R(v);
                    g = RGB8888_G(v);
                    b = RGB8888_B(v);
                    int sum = r + g + b;
                    *((uint32_t *) pixel) = MAKE_ARGB(0x1f, sum / 3, sum / 3, sum / 3);
                } else if (bitmapInfo.format == ANDROID_BITMAP_FORMAT_RGB_565) {
                    pixel = ((uint16_t *) pixels) + y * bitmapInfo.width + x;
                    int r, g, b;
                    uint16_t v = *((uint16_t *) pixel);
                    r = RGB565_R(v);
                    g = RGB565_G(v);
                    b = RGB565_B(v);
                    int sum = r + g + b;
                    *((uint16_t *) pixel) = MAKE_RGB565(sum / 3, sum / 3, sum / 3);
                }
            }
        }
        /*d) 用 AndroidBitmap_unlockPixels() 解锁*/
        AndroidBitmap_unlockPixels(env, bitmap);
    
    }
    
    

    java 部分

    /**
     *
     * kotlin 版本
     *
     */
    object CppUtils {
    
        init {
            System.loadLibrary("app")
        }
    
        external fun stringFromJNI(): String
        external fun imgToGray(bitmap: Bitmap)
    
    }
    

    这里没有返回来bitmap,直接处理的bitmap。
    走完就是处理完btmap了。

    相关文章

      网友评论

        本文标题:android ndk 开发2

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