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

时间:2017-05-18 10:28:29

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

我现在已经挣扎了好几天了。目前我只是用一个简单的C ++项目(1 .h& 1 .cpp文件)和一个简约的应用程序来测试它,包括ndk helloJNI示例代码(它很容易完美地工作):

:定位 将现有的C / C ++文件(项目)导入Android Studio

方法 在尝试了一些(几十种)不同的可能性之后,我认为/认为以下步骤对我来说是最好的解决方案:

  1. 从Visual Studios 2015创建共享库(Calculator.so)"为Android创建共享库" (或其他)[成功]
  2. 在src / main /中创建jniLibs文件夹及其子文件夹(x86是我的相关文件夹)
  3. 在src / main / jniLibs中添加Android.mk文件,该文件必须放在那里(?)
  4. 包含声明:System.loadLibrary(" Calculator")没有" lib"和" .so"在MainActivity中
  5. 该库在Android Studio的jniLibs文件夹中列出,就像Android.mk一样。此外,如果我构建apk,库成功打包(通过解压缩验证),我不会得到任何错误。 但是:我怎样才能调用库中的方法?我尝试了其他线程中提供的不同解决方案,但我想我错过了我的.mk或我上面描述的步骤。

    试过

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

    非常感谢您的帮助!

    Android.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)
    

1 个答案:

答案 0 :(得分:0)

你可以在Android NDK中做很多事情。例如,Camera硬件是Android OS中最重的硬件之一。检测面部,物体,效果以及成千上万的特征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. 在静态方法中,在您需要的任何活动中调用您的库。像这样:

    static {  System.loadLibrary("my_library") }
    

    没有&#34; lib&#34;和&#34; .so&#34;扩展。

  5. 如果您想调用本机方法,只需使用&#34; native&#34;关键词。例如:

    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。

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