问题标签 [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.
android - 如何在 Android 应用程序 (SDK 29+) 中嵌入本机代码库?
我有一个使用本机代码库的应用程序——碰巧是 ffmpeg 的自定义构建,尽管这并不严格相关。
到目前为止,我已将可执行文件添加到我的 res/raw 目录,然后在运行时将其解压缩到数据文件夹,然后使用 exec() 调用它。但是,从 compileSdkVersion=29 开始,由于 W^X 漏洞的新安全性,它已经停止工作。现在调用 exec() 会导致异常:
我已阅读这些页面:
权限被拒绝使用 Android Q ffmpeg”:错误 = 13,权限被拒绝
https://issuetracker.google.com/issues/152645643
因此,据我了解,正确的方法是:
- 把我的库放到项目的/libs目录下
- 添加
android:extractNativeLibs = "true"
到 AndroidManifest.xml - 确保文件名与“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 目录。就好像构建过程不知道本机库的存在并且没有将其复制进去。
android - 修复旧 Android 版本的 PDFium 崩溃或包含自己的库
我有一个使用该标准PdfRenderer
呈现 PDF 的 Android 应用程序。到目前为止它工作得很好,我设法摆脱了应用程序中的大部分错误。
我不知道如何摆脱的唯一错误是:
它发生在几种变体中(不仅是 FPDF_CloseDocument),并且在每日会话中产生高达 4% 的崩溃。在各种设备上从 5 到 8 的 Android 版本上都会遇到此问题。
经过一番搜索,该PDFium
库(基于该库PdfRenderer
)似乎在早期版本中有一些错误。这就是问题在 Android 9 和 10 上没有出现的原因。
所以我的实际任务是摆脱 11 次 SIGSEGV 崩溃。
在这里,我有以下想法:
在我的应用程序中包含最新版本的 PDFium。目前 libpdfium.so 包含在 Android 操作系统中。我可以将最终更正的库包含到我的应用程序中并使用它吗?在哪里可以找到 libpdfium.so 以及如何在应用程序中使用它?
使用替代的 PDF 渲染器。我需要以所需的缩放和分辨率呈现 PDF 页面的一部分,并且我需要一个非常宽松的许可证,例如 MIT 或 Apache,所以我不需要开源我的项目。我没有找到任何合适的,例如MuPDF需要开源整个项目,PSPDFKit是完全专有的。
摆脱 11 次 SIGSEGV 崩溃有什么更好的方法?
android - 使用 Android.mk 从预构建的 apk 文件中提取本机库
我有一个带有捆绑本机库的 APK 文件。当我使用 adb 安装它们时,库会在 <path-to_package>/lib/ 中正确创建,但我必须将我的 apk 与 Android.mk 文件一起集成到构建系统中。我需要在 make 中添加什么才能将库提取到目标上
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:
如果有人可以提供帮助,那将是最受欢迎的!
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 :
android - 有没有办法使用 NDK 绕过 android 运行时请求权限?
我只是想知道是否有一种方法可以使用相机和存储,而无需在运行时请求它并且无需将 targetSdkVersion 设置为 21,提前感谢并抱歉,如果这个问题在某种程度上听起来很愚蠢。
编辑1:我不一定要绕过,如果我使用NDK,我想知道运行时是否需要android权限。
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
谢谢!问候!
android - hwuiTask1 中的致命信号 11 (SIGSEGV),代码 1 (SEGV_MAPERR)
我的 Android 应用程序因以下错误而崩溃。我对本地人了解不多。
我的应用程序是一个数字标牌应用程序,其中视频和图像在循环中交替运行。用于播放视频 exoplayer 用于图像渲染,使用 Glide。
请指导我此错误的原因和解决方案。
android - Android:在 android studio 中进行 NDK-Build C/C++ 调试
在 Android Studio(v4.1.2) 中尝试 ndk-build C 代码调试。下面是 build.gradle 设置。
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 文件失败并出现以下错误。
断点当前不会被命中。没有可执行代码与此行相关联
谢谢