簡體   English   中英

如何在Android中構建沒有JNI的共享庫?

[英]How to build a shared library without JNI in Android?

我開發了一個Android應用程序,它需要是一個共享庫。 我已經在Linux中使用了相同的lib(使用gcc),所以我想在Android(ARM處理器)中編譯相同的共享庫。 但NDK只支持JNI。 現在我想構建一個沒有直接JNI交互的獨立共享庫。 我有很多C文件和標題,所以我不能為所有東西編寫JNI。 我想為ARM處理器構建我的庫。 我怎樣才能做到這一點?

my stuture is
  ----->JNI
     ---->myfile.c(jni c code)
      ----->android.mk(here i call my two shared lib)

       folder1
             --->include
             ----src
             ---->lib(here i will get my shared lib)
       folder 2
            ----->include
            ----->src
            ----->lib(here i will get my 2nd shared lib)

在這里,我想分別構建我的共享庫,然后我會調用它。 在Android中沒有JNI可以構建一個shred庫嗎?

Android NDK對使用它構建的二進制文件的JNI合規性沒有要求。 但通常Android應用程序是用Java編寫的,當它們使用本機組件時,自然路徑就是使用JNI。

Android NDK提供了豐富且易於使用的ndk-build命令,它要求您准備至少一個make系統使用的Android.mk文件。 在許多情況下,根據您的makefile准備此類文件是值得的。 但如果你從另一個平台端口采用先進的項目configureCmake功能,你可以跳過Android.mk完全,並使用獨立的工具鏈,這是NDK的一部分, 描述 NDK官方文檔。 請注意,Android不支持完整的Linux glibc ,而是支持bionic的子集。 STL支持也不明顯,你必須選擇7個選項之一

您可以在此處停止,獲取共享庫或可執行文件,並以傳統的Linux方式使用它們。 您可以使用C ++構建所有Android應用程序

但最簡單的方法是使用Android SDK構建Java Android應用程序,並通過JDK調用一些本機方法。 您將需要一個包裝.so對於這一點,該出口JNI功能的Java和調用非JNI庫又將庫。 Android.mk您可以使用LOCAL_SHARED_LIBRARIES引用這些庫。 您可能會發現以下問題對此部分有用: 在主項目源樹之外的ndk構建庫

您需要在Java代碼中“手動”加載本機庫。 系統加載程序僅搜索/system/lib文件夾中的未解析引用。

傳統的地方是使用本機方法的Java類的靜態構造函數。 裝載順序很重要。 如果libone.so依賴於libtwo.so ,而libjni.so依賴於libonelibtwo ,你會有類似的東西

{
  System.Load("two");
  System.Load("one");
  System.Load("jni");
}

您還應確保Android SDK 構建器在創建APK文件時在libs/armeabilibs-armeabi-v7a目錄中找到這些文件。

可以在不編寫任何JNI特定C代碼的情況下構建本機庫。 您需要為庫創建Android.mkApplication.mk文件。 您已准備好有效的makefile ,因此您可以使用它來制作Android.mk

Application.mk可以如下:

APP_OPTIM := release
APP_PLATFORM := android-7
APP_STL := gnustl_static
APP_CPPFLAGS += -frtti 
APP_CPPFLAGS += -fexceptions
APP_CPPFLAGS += -DANDROID
APP_ABI := armeabi-v7a
APP_MODULES := <put-the-name-of-your-library-here>

使用ndk-build編譯庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM