当前位置: 首页 > wzjs >正文

京美建站有代码吗电脑版和手机版网站怎么做

京美建站有代码吗,电脑版和手机版网站怎么做,visio做网站效果,网站双语怎么做文章目录 Android Jni(二)加载调用第三方 so 库前置知识CPU架构 ABI 基本步骤1、将第三方 SO 库文件放入项目中的正确位置:2. 创建 JNI 接口3. 实现 JNI 层代码4、配置 CMake 常见问题解决1、UnsatisfiedLinkError:2、函数找不到&…

文章目录

      • Android Jni(二)加载调用第三方 so 库
      • 前置知识
        • CPU架构 ABI
      • 基本步骤
        • 1、将第三方 SO 库文件放入项目中的正确位置:
        • 2. 创建 JNI 接口
        • 3. 实现 JNI 层代码
        • 4、配置 CMake
      • 常见问题解决
        • 1、UnsatisfiedLinkError:
        • 2、函数找不到:
        • 3、ABI 不匹配:
      • 遇到的问题
        • 1、include 找不到头文件
        • 2、Jni 不同库的引入了重复 so,导致冲突
        • 3、多个本地库
        • 4、return NewStringUTF(char*) 报格式错误
        • 5、指针类型不一致报错
        • 6、Bitmap 转 yuv 反色
        • 7、接入的三方库头文件依赖了其他头文件找不到
      • 参考文章

Android Jni(二)加载调用第三方 so 库

前置知识

CPU架构 ABI

接入第三方 so 库时需要注意目标设备是否支持,不然会找不到 so 库

abiFilters是用于指定在构建Android应用程序时应包含哪些CPU架构ABI(Application Binary Interface)的一种配置参数。它的常见取值包括"armeabi-v7a"、“arm64-v8a”、“x86”、"x86_64"等,具体取决于应用程序要支持的目标设备的CPU架构。在构建Gradle/Android项目时,可以通过在build.gradle配置文件中设置abiFilters来指定所需的CPU架构ABI。

基本步骤

1、将第三方 SO 库文件放入项目中的正确位置:
app/src/main/jniLibs/armeabi-v7a/    // 32位 ARMlibthirdparty.soarm64-v8a/      // 64位 ARMlibthirdparty.sox86/            // x86libthirdparty.so

或者在 build.gradle 中指定库的位置:

android {sourceSets {main {jniLibs.srcDirs = ['libs']}}
}
2. 创建 JNI 接口
public class NativeWrapper {static {// 先加载依赖库(如果有)System.loadLibrary("dependency");// 然后加载目标库System.loadLibrary("thirdparty");// 最后加载你自己的JNI库System.loadLibrary("mylibrary");}// 声明native方法public native int callThirdPartyFunction(int param);
}
3. 实现 JNI 层代码

创建 jni/mylibrary.c 文件:

#include <jni.h>
#include <android/log.h>// 声明第三方库的函数
extern int third_party_function(int param);JNIEXPORT jint JNICALL
Java_com_example_NativeWrapper_callThirdPartyFunction(JNIEnv *env, jobject instance, jint param) {// 调用第三方库函数int result = third_party_function(param);return (jint)result;
}
4、配置 CMake
add_library(thirdparty SHARED IMPORTED)
set_target_properties(thirdparty PROPERTIES IMPORTED_LOCATION${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libthirdparty.so)add_library(mylibrary SHAREDmylibrary.c)target_link_libraries(mylibrary thirdparty)

常见问题解决

1、UnsatisfiedLinkError:

检查库文件名是否正确(前缀 lib,后缀 .so)
检查库是否放在正确的 ABI 目录下
检查是否有依赖库未加载

2、函数找不到:

使用 nm -D libthirdparty.so 检查导出的函数名

可能需要 extern “C” 包装

3、ABI 不匹配:

确保应用和所有库使用相同的 ABI

64位设备可以运行32位库,但反过来不行

遇到的问题

1、include 找不到头文件

原因: include_directories 设置的路径不对
解决方法:根据自己项目实际情况设置路径
在这里插入图片描述

2、Jni 不同库的引入了重复 so,导致冲突

确保项目中只包含一个libc++_shared.so版本。可以通过在项目的build.gradle文件中配置packagingOptions来选择第一个找到的libc++_shared.so文件,使用pickFirst策略5。

3、多个本地库

CMakeLists.txt 额外配置 target_link_libraries

target_link_libraries(local_lib1# List libraries link to the target libraryandroidlog)target_link_libraries(local_lib2# List libraries link to the target libraryandroidlog)
4、return NewStringUTF(char*) 报格式错误
对数组进行初始化赋值
char a[10] = {""};
5、指针类型不一致报错

严格按照 api 文档传入指针

6、Bitmap 转 yuv 反色

问题原因是如下代码中,g b 数据通道,赋值反了,如何保存的 ARGB_8888 注释中有写。
在这里插入图片描述

#include <android/bitmap.h>
#include <jni.h>
#include <cstdint>
#include <cstring>// ARGB 转 NV12 的函数
void ARGB_to_NV12(jint *argb, jbyte *nv12, jint width, jint height) {int frameSize = width * height;int yIndex = 0;int uvIndex = frameSize;for (int j = 0; j < height; ++j) {for (int i = 0; i < width; ++i) {int R = (argb[(j * width) + i] >> 16) & 0xFF;int G = (argb[(j * width) + i] >> 8) & 0xFF;int B = argb[(j * width) + i] & 0xFF;// 计算 YUV 分量int Y = ((66 * R + 129 * G + 25 * B + 128) >> 8) + 16;int U = ((-38 * R - 74 * G + 112 * B + 128) >> 8) + 128;int V = ((112 * R - 94 * G - 18 * B + 128) >> 8) + 128;// 存储 Y 分量nv12[yIndex++] = static_cast<jbyte>((Y < 0) ? 0 : ((Y > 255) ? 255 : Y));// 存储 UV 分量(交错存储)if (j % 2 == 0 && i % 2 == 0) {nv12[uvIndex++] = static_cast<jbyte>((U < 0) ? 0 : ((U > 255) ? 255 : U));nv12[uvIndex++] = static_cast<jbyte>((V < 0) ? 0 : ((V > 255) ? 255 : V));}}}
}// JNI 函数
extern "C"
JNIEXPORT jbyteArray JNICALL
Java_com_example_YourClass_convertBitmapToNV12(JNIEnv *env, jobject thiz, jobject bitmap) {AndroidBitmapInfo info;void *pixels;jbyteArray nv12Array = nullptr;// 获取 Bitmap 信息if (AndroidBitmap_getInfo(env, bitmap, &info) != ANDROID_BITMAP_RESULT_SUCCESS) {return nullptr;}// 检查 Bitmap 格式是否为 RGBA_8888if (info.format != ANDROID_BITMAP_FORMAT_RGBA_8888) {return nullptr;}// 锁定 Bitmap 像素数据if (AndroidBitmap_lockPixels(env, bitmap, &pixels) != ANDROID_BITMAP_RESULT_SUCCESS) {return nullptr;}int width = info.width;int height = info.height;int frameSize = width * height;// 创建 NV12 数组(Y 分量占 width * height,UV 分量占 width * height / 2)nv12Array = env->NewByteArray(frameSize * 3 / 2);jbyte *nv12 = env->GetByteArrayElements(nv12Array, nullptr);// 将 ARGB 转换为 NV12ARGB_to_NV12(static_cast<jint *>(pixels), nv12, width, height);// 释放资源env->ReleaseByteArrayElements(nv12Array, nv12, 0);AndroidBitmap_unlockPixels(env, bitmap);return nv12Array;
}
7、接入的三方库头文件依赖了其他头文件找不到

算法给的头文件,可能会包含一些你不需要的代码,之间删除即可,不影响调用。

参考文章

Android jni引用第三方so动态库和.a静态库并且调用©方法

Android JNI学习-调用第三方SO库

Android 通过JNI调用三方so 高效教程

cmake使用详细教程(日常使用这一篇就足够了)


文章转载自:

http://fGhwhYNU.wjhqd.cn
http://XirUBw2q.wjhqd.cn
http://j14xTmS7.wjhqd.cn
http://WOU8fkUs.wjhqd.cn
http://qoYEKD4v.wjhqd.cn
http://d014EZf9.wjhqd.cn
http://0o341xuT.wjhqd.cn
http://tfsxIR8R.wjhqd.cn
http://ZtJbZNJp.wjhqd.cn
http://iptkYhoi.wjhqd.cn
http://4iWSLMff.wjhqd.cn
http://cXZxsEu1.wjhqd.cn
http://qskIXn8W.wjhqd.cn
http://CX91XDJ0.wjhqd.cn
http://mZ583bAz.wjhqd.cn
http://tjuDqj5m.wjhqd.cn
http://KhtaI3Sk.wjhqd.cn
http://cM21899C.wjhqd.cn
http://HNTSol3z.wjhqd.cn
http://t3aNfEcK.wjhqd.cn
http://vaMMWrv0.wjhqd.cn
http://HfZNrLfD.wjhqd.cn
http://qbuqY9hC.wjhqd.cn
http://vDs7sPij.wjhqd.cn
http://qaI1tPeH.wjhqd.cn
http://RpMlVXaa.wjhqd.cn
http://ZowEe9Ug.wjhqd.cn
http://lU4Rki3S.wjhqd.cn
http://StrmPdnS.wjhqd.cn
http://12nNZxv0.wjhqd.cn
http://www.dtcms.com/wzjs/724255.html

相关文章:

  • 外贸网站哪个比较好网站接入支付宝在线交易怎么做
  • 在网上招标做兼职的网站青柠影视免费高清电视剧
  • 个人网站备案网站名称深圳龙华区龙华街道高坳新村
  • 安徽网站建设制作建立新中国的构想及其实践
  • 东圃做网站的公司北京市建设工程交易服务平台
  • 商城网站建设42623d建模图片
  • 怎么发布个人网站学会了vue 能搭建一个网站平台
  • 湘西网站建设设计师做网站的流程
  • 湖南微信网站首都产业建设集团网站
  • 网站建设资料需要公司提交的吗南京机械加工网
  • 珠海网站建设成功案例室内设计联盟论坛
  • 网站中单选按钮怎么做wordpress 调用 函数
  • 邵阳竞价网站建设设计前端网站开发毕设类型
  • 网站结构的类型汕头网站建设和运营
  • 东莞网站推广怎么样沈阳广告设计公司
  • 资讯类网站怎么做怎么开通个人网站
  • 兼职网网站建设方案相片制作图片
  • 竭诚网络网站建设公司哈尔滨设计公司排名
  • 做酒水网站陕西有哪些开发网站报价方案
  • 网站判断手机跳转代码网站图片上浮动文字
  • 做投诉网站赚钱吗wordpress撰写
  • 公司网站运营包括哪些方面企业微网站案例
  • 外贸大型门户网站建设网站seo可以做吗
  • 用ps做网站得多大像素网站ip域名查询
  • 一个公司可以做几个网站备案游戏网页代码
  • 怎么做免费的宣传网站凯里市企业建站公司
  • 名师工作室网站建设现状调查关键词列表
  • 申请免费网站主页空间企业做网站需要在通管局备案
  • 设计了网站计算机网站模板
  • 深圳网站设计建设传媒公司网站制作