android - 在 Android Studios C 文件中调用共享库 (.so) 方法

标签 android android-ndk shared-libraries native .so

我已经为此苦苦挣扎了好几天。目前,我只是用一个简单的 C++ 项目(1 个 .h 和 1 个 .cpp 文件)和一个包含 ndk helloJNI 示例代码(非常容易运行)的简约应用程序对其进行测试:

目标 导入已有的C/C++文件(项目)到Android Studio

方法 在尝试了一些(数十种)不同的可能性之后,我认为/认为以下步骤将是实现我的目的的最佳解决方案:

  1. 从 Visual Studios 2015“为 Android 创建共享库”(或其他)创建共享库 (Calculator.so) [成功]
  2. 在 src/main/中创建 jniLibs 文件夹及其子文件夹(x86 在我的例子中是相关的)
  3. 在 src/main/jniLibs 中添加 Android.mk 文件,该文件必须放在那里 (?)
  4. Include 语句:System.loadLibrary("Calculator") 在 MainActivity 中没有“lib”和“.so”

该库与 Android.mk 一样列在 Android Studio 的文件夹 jniLibs 中。此外,如果我构建 apk,则库已成功打包(通过解压缩验证)并且我没有收到任何错误。 但是:我如何调用库中的方法?我尝试了其他线程中提供的不同解决方案,但我想我在 .mk 或上述步骤中遗漏了一些东西。

尝试过

  • 不同 #include <myLib> native-lib.cpp 中的语句,如 s
  • 不同的 Android.mk 设置(但我是制作文件的新手,所以即使是教程也无法帮助我解决我的具体问题 :))
  • libCalculator.so 的其他位置,例如子文件夹 x86 中
  • 和许多其他人 - 根本不提醒 atm(wasntme)

非常感谢您的帮助!

安卓.mk

LOCAL_PATH := $(call my-dir)
APP_ABI := x86        

# library info       
include $(CLEAR_VARS)
LOCAL_MODULE := Calculator
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/Calculator.so
LOCAL_EXPORT_C_INCLUDES := ..../Visual Studio 2015/Projects/SO_Library/SO_Library
include $(BUILD_SHARED_LIBRARY)

最佳答案

您可以在 Android NDK 中做很多事情。例如,相机硬件是 Android 操作系统中最重的硬件之一。检测人脸、事物、提供效果和数以千计的特征,NDK 是最好的。 对您的步骤有一些帮助:

  1. 您还可以在 Android Studio 中构建和预构建共享 (.so) 和静态 (.a) 库。不需要 Visual Studio。
  2. 不要在主文件夹中创建 jniLibs 文件夹。当您通过 gradle 构建项目时,它已经创建了这个文件夹并放置了您的目标库。如果您想要预构建任何库,请将这些库放在 main/jni/libs 文件夹中,然后使用 Android.mk 进行预构建。
  3. 不要在 jnilibs 文件夹中添加 Android.mk 文件。在 main/jni 文件夹中创建此文件。还有 Application.mk 文件。
  4. 在您需要的任何 Activity 中,以静态方法调用您的库。像这样:

    static {  System.loadLibrary("my_library") }
    

    没有“lib”和“.so”扩展名。

当您想调用本地方法时,只需使用“native”关键字即可。例如:

private native int nGetNumberFromNativeSide();

只需在需要的地方调用此方法,即可获得结果。但是对于 gradle 端的 ndk 构建,请看这个 answer .对于在 Android.mk 中构建库,这些示例行可能对您有所帮助:

include $(CLEAR_VARS)
ifneq (,$(filter $(TARGET_ARCH_ABI), armeabi-v7a x86 arm64-v8a x86_64))

LOCAL_MODULE := my_library
LOCAL_SRC_FILES := $(LOCAL_SRC_LOCATION)/native1.cpp native2.cpp
include $(BUILD_SHARED_LIBRARY)
  • 您可以随心所欲地命名,但不要添加 lib 和 .so 扩展名。 Ndk 已经在做了。
  • 我已经给出了 Android.mk 的例子。
  • 当您构建 Android.mk 文件时,它会找到您的库的适当文件夹。比如 main/libs/x86/libmy_library.so。

我想这个答案会对你有所帮助。如果您有更多问题,请添加评论,我将编辑我的答案并添加答案。

关于android - 在 Android Studios C 文件中调用共享库 (.so) 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44045260/

相关文章:

android - 为主项目和库项目添加依赖项

c++ - 双簧管异步音频提取

c - 无法从与共享库链接的 C 程序访问全局程序集标签数​​据

c - 了解 glibc

android:从字符串数组中获取项目并在 TextView 中一一显示

android - Worker.setForegroundAsync 如何在幕后工作?

android - 华为 P40 Google Play 服务对话框

android构建静态库

android - 直接访问android通知?

c++ - 自己的lib,另一台电脑: cannot open shared object file: No such file or directory