我已经为此苦苦挣扎了好几天。目前,我只是用一个简单的 C++ 项目(1 个 .h 和 1 个 .cpp 文件)和一个包含 ndk helloJNI 示例代码(非常容易运行)的简约应用程序对其进行测试:
目标 导入已有的C/C++文件(项目)到Android Studio
方法 在尝试了一些(数十种)不同的可能性之后,我认为/认为以下步骤将是实现我的目的的最佳解决方案:
- 从 Visual Studios 2015“为 Android 创建共享库”(或其他)创建共享库 (Calculator.so) [成功]
- 在 src/main/中创建 jniLibs 文件夹及其子文件夹(x86 在我的例子中是相关的)
- 在 src/main/jniLibs 中添加 Android.mk 文件,该文件必须放在那里 (?)
- 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 是最好的。 对您的步骤有一些帮助:
- 您还可以在 Android Studio 中构建和预构建共享 (.so) 和静态 (.a) 库。不需要 Visual Studio。
- 不要在主文件夹中创建 jniLibs 文件夹。当您通过 gradle 构建项目时,它已经创建了这个文件夹并放置了您的目标库。如果您想要预构建任何库,请将这些库放在 main/jni/libs 文件夹中,然后使用 Android.mk 进行预构建。
- 不要在 jnilibs 文件夹中添加 Android.mk 文件。在 main/jni 文件夹中创建此文件。还有 Application.mk 文件。
在您需要的任何 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/