前言
看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了。
网友评论