问题标签 [android-native-library]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
344 浏览

android - 如何在 Android 应用程序 (SDK 29+) 中嵌入本机代码库?

我有一个使用本机代码库的应用程序——碰巧是 ffmpeg 的自定义构建,尽管这并不严格相关。

到目前为止,我已将可执行文件添加到我的 res/raw 目录,然后在运行时将其解压缩到数据文件夹,然后使用 exec() 调用它。但是,从 compileSdkVersion=29 开始,由于 W^X 漏洞的新安全性,它已经停止工作。现在调用 exec() 会导致异常:

我已阅读这些页面:
权限被拒绝使用 Android Q ffmpeg”:错误 = 13,权限被拒绝
https://issuetracker.google.com/issues/152645643

因此,据我了解,正确的方法是:

  1. 把我的库放到项目的/libs目录下
  2. 添加android:extractNativeLibs = "true"到 AndroidManifest.xml
  3. 确保文件名与“lib*.so”模式匹配

然后安装应该将库解压缩到一个可执行位置,我应该能够在运行时读取它。

它只是不工作。我一定错过了一个重要的步骤。

我的代码

应用程序/build.gradle:

AndroidManifest.xml:

活动代码(基于基本活动模板):

项目树 在此处输入图像描述

结果(在模拟器上)

为什么我的运行时代码找不到库?

我努力了:

  • 在build.gradle implementation files('libs/libffmpeg.so')> dependencies { ... } 中添加
  • 添加implementation fileTree(dir: "libs", include: ["lib*.so"])
  • 创建 libs/x86 和 libs/arm64 子目录并将 libffmpeg.so 放入其中

我已经展开 .apk 文件并将其解压缩,其中没有 lib 目录。就好像构建过程不知道本机库的存在并且没有将其复制进去。

0 投票
1 回答
244 浏览

android - 修复旧 Android 版本的 PDFium 崩溃或包含自己的库

我有一个使用该标准PdfRenderer呈现 PDF 的 Android 应用程序。到目前为止它工作得很好,我设法摆脱了应用程序中的大部分错误。

我不知道如何摆脱的唯一错误是:

它发生在几种变体中(不仅是 FPDF_CloseDocument),并且在每日会话中产生高达 4% 的崩溃。在各种设备上从 5 到 8 的 Android 版本上都会遇到此问题。

经过一番搜索,该PDFium库(基于该库PdfRenderer)似乎在早期版本中有一些错误。这就是问题在 Android 9 和 10 上没有出现的原因。

所以我的实际任务是摆脱 11 次 SIGSEGV 崩溃

在这里,我有以下想法:

  1. 在我的应用程序中包含最新版本的 PDFium。目前 libpdfium.so 包含在 Android 操作系统中。我可以将最终更正的库包含到我的应用程序中并使用它吗?在哪里可以找到 libpdfium.so 以及如何在应用程序中使用它?

  2. 使用替代的 PDF 渲染器。我需要以所需的缩放和分辨率呈现 PDF 页面的一部分,并且我需要一个非常宽松的许可证,例如 MIT 或 Apache,所以我不需要开源我的项目。我没有找到任何合适的,例如MuPDF需要开源整个项目,PSPDFKit是完全专有的。

摆脱 11 次 SIGSEGV 崩溃有什么更好的方法?

0 投票
2 回答
1548 浏览

android - 使用 Android.mk 从预构建的 apk 文件中提取本机库

我有一个带有捆绑本机库的 APK 文件。当我使用 adb 安装它们时,库会在 <path-to_package>/lib/ 中正确创建,但我必须将我的 apk 与 Android.mk 文件一起集成到构建系统中。我需要在 make 中添加什么才能将库提取到目标上

0 投票
1 回答
359 浏览

android - 在 Android Studio 中调试 C++/Native 代码不适用于较旧的 Android SDK API 版本

一般问题

我有一个针对两个不同 API 版本的 Android Native 应用程序:23(Marshmallow)和 28(Pie)。对于 API 28,当 hello world 应用程序进入 C++ 代码时,我可以毫无问题地调试它:调试器附加自身并在我的断点处停止执行。然而,对于 API 23,调试器会附加自身,但不会在断点处停止。这两种 API 的行为在模拟器和真实设备之间是一致的。

版本

  • 视窗 10
  • 安卓工作室 4.1.1
  • 摇篮 6.5
  • NDK 21.1.6352462
  • CMake 3.10.2.4988404

模拟器比较

API 23

  • 银河 Nexus 4.65 720x1280
  • Android 6.0 x86_64(棉花糖)

API 28

  • 银河 Nexus 4.65 720x1280
  • Android 9.0 x86_64(派)

这里唯一的区别实际上是操作系统。包括内存分配在内的其他一切似乎都完全相同。

代码

两种情况下的代码都是一样的。它几乎遵循 Android 提供的默认 JNI 模板。无论如何,我都会发布所有内容。

根 build.gradle

应用程序 build.gradle

AndroidManifest.xml

MainActivity.java

本机 lib.cpp

CMakeList.txt

如果有人可以提供帮助,那将是最受欢迎的!

0 投票
1 回答
381 浏览

android - 带有本机库的 Android - 连接 CDC USB 设备 - 无法在本机库中使用 fd

我正在尝试使 android 平板电脑与 USB 设备(STM32 Nucleo)进行通信。我在github上开发了一个草图:

  • 该移动应用程序是使用 Xamarin 和 VS Studio 开发的。它充当 USB 主机
  • STM32 Nucleo 应用程序是使用 STMCube 开发的,并使用它的 USB 堆栈作为 CDC 设备。
  • 我开发了一个小型主/从协议来交换“注册”ID/值。该设备是从站。

我设法使用 Android.hardware.usb API 使其工作。但是我必须使用本机 C 共享对象库进行通信,就像它在其他平台上使用的那样,这就是我现在遇到问题的地方。我使用 swig 嵌入了库并使用 VS Studio 构建它。我尝试了两种使库与设备通信的方法:

  • 从 Android 端获取权限和 fd 并将其传递给执行标准读/写操作的库。
  • 从 Android 执行与上述相同的操作,但也使用 fd 传递使用 linux usbdevice_fs API 调用批量传输的端点编号;更像是在那个问题上提出的。

两种方法都失败并返回有关不存在的 fd 的错误。我检查了 fd 和 enpoints 值,它们与 Android 相同。我启动了android usb设备监视器,找不到创建的fd。我不能使用任何像 termux 这样的 android shell 来列出进程 /proc 树。但我仍然可以在 Android 端使用 tehm。

从社区我检查了将 fd 传递给本机库是正确的方法。我现在不知道该怎么办,请问还有更多权限吗?

下面是我如何检索 fd :

捕获未能使用本机库的移动应用程序

0 投票
2 回答
4380 浏览

android - 反应本机崩溃:线程:SIGSEGV libjsc.so

我们在 android 设备中的各种随机位置发生了以下崩溃。虽然我们已将 ndk abifilters 更改为“armeabi-v7a”、“arm64-v8a”

当前配置

RN 版本 0.63.4

在此处输入图像描述

在此处输入图像描述

0 投票
1 回答
92 浏览

android - 有没有办法使用 NDK 绕过 android 运行时请求权限?

我只是想知道是否有一种方法可以使用相机和存储,而无需在运行时请求它并且无需将 targetSdkVersion 设置为 21,提前感谢并抱歉,如果这个问题在某种程度上听起来很愚蠢。

编辑1:我不一定要绕过,如果我使用NDK,我想知道运行时是否需要android权限。

0 投票
1 回答
35 浏览

actionscript-3 - gearsandcogs 扩展是否仍在最新的 AIR 版本 32.0+ 中工作?

我在 AS3 中有一个使用包 com.gearsandcogs.air.extensions 的项目。当尝试编译原生 Android APK 时,显示此错误:

“在目标平台上找不到应用程序所需的本机扩展 'com.gearsandcogs.air.extensions.PackageManager' 的实现。”

在描述 XML 中:

如果我评论“extensionID”,编译 apk 时不会出错。

解决这个或其他 PackageManager 替代方案的建议?

带有 VSCode+ActionScript 和 MXML 扩展的 Harman SDK 33.1

谢谢!问候!

0 投票
0 回答
434 浏览

android - hwuiTask1 中的致命信号 11 (SIGSEGV),代码 1 (SEGV_MAPERR)

我的 Android 应用程序因以下错误而崩溃。我对本地人了解不多。

我的应用程序是一个数字标牌应用程序,其中视频和图像在循环中交替运行。用于播放视频 exoplayer 用于图像渲染,使用 Glide。

请指导我此错误的原因和解决方案。

0 投票
3 回答
835 浏览

android - Android:在 android studio 中进行 NDK-Build C/C++ 调试

在 Android Studio(v4.1.2) 中尝试 ndk-build C 代码调试。下面是 build.gradle 设置。

  1. jni , C/C++ 源文件 Dirs. 实际的 C 文件不在 jni 文件夹下,而是在它之外,但在 android.mk 文件中引用。

    sourceSets.main.jniLibs.srcDirs = ['D:/ccodefolder/jni/']

2)Android.mk 从 C、c++ 代码构建一个共享库,并链接内置的共享库和静态库。

4) 项目结构如图所示。

在此处输入图像描述

能够运行项目并生成共享库以及其他预构建的 .SO 和 apk 作品,还创建了 CPP 文件夹并能够查看我的项目的 C 代码文件。

调试问题:

LLDB 服务器启动并且调试器附加到进程,但调试任何 C 文件失败并出现以下错误。

断点当前不会被命中。没有可执行代码与此行相关联

在此处输入图像描述

谢谢