2017-05-18 291 views
2

我正在爲此奮鬥了好幾天。在Android Studios C文件中調用共享庫(.so)方法

目標 進口:目前我只是一個簡單的C++項目(1個.H & 1 .cpp文件)和簡約的應用程序包括NDK helloJNI示例代碼(這完美的工作容易)測試它現有的C/C++文件(項目)到Android工作室

方法 嘗試一些的(幾十個)的不同的可能性之後,我覺得/想下面的步驟將是我的目的,最好的解決辦法:

  1. 從Visual Studios 2015創建共享庫(或創建共享庫)[成功]
  2. 在src/main /及其子文件夾中創建jniLibs文件夾(x86中與我相關的文件夾case)
  3. 在src/main/jniLibs中添加必須放在那裏的Android.mk文件(?)
  4. 包含聲明:沒有「lib」和「.so」的System.loadLibrary(「Calculator」) MainActivity

該庫在Android Studio中的文件夾jniLibs中與Android.mk類似。此外,如果我構建apk,庫成功打包(通過解壓縮驗證),我沒有得到任何錯誤。 但是:我該如何調用庫中的方法?我嘗試了其他線程提供的不同解決方案,但我想我錯過了我的.mk或我上面描述的步驟。

試圖在本機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) 

回答

0

有很多的東西,你可以在Android的NDK做。例如,相機硬件是Android OS中最重的硬件之一。檢測面部,事物,產生效果和成千上萬的功能NDK是最好的。 一些幫助您步驟:

  1. 您可以建立和預建共享(的.so)和Android Studio中還靜態(.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") } 
    

    沒有「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擴展。恩德克已經在這樣做。
  • 我已經給了Android.mk的例子。
  • 當您構建Android.mk文件時,它會查找您的庫相應的文件夾。像main/libs/x86/libmy_library.so。

我想這個答案會幫助你。如果您有更多問題,請添加評論,我將編輯我的答案並添加答案。

+0

我得到了從Android Studio編譯的庫。非常感謝你對.mk文件的大力幫助 - 我從我的搜索中誤解了很多。現在我還有一個問題:因爲我無法實現,我怎麼能運行.so方法(不包裹在.jni語法中)讓我們說示例native-lib.cpp? –

+0

不客氣!)。 .SO不是方法,它們是共享庫。哪些是從C++源和一些靜態庫構建而成的。要使用.SO庫中存在的方法,可以使用「native」關鍵字進行調用。我已經解釋過了。 – JavadKhan

相關問題