美文网首页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