[英]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准備此類文件是值得的。 但如果你從另一個平台端口采用先進的項目configure
或Cmake
功能,你可以跳過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
依賴於libone
和libtwo
,你會有類似的東西
{
System.Load("two");
System.Load("one");
System.Load("jni");
}
您還應確保Android SDK 構建器在創建APK文件時在libs/armeabi
或libs-armeabi-v7a
目錄中找到這些文件。
可以在不編寫任何JNI
特定C代碼的情況下構建本機庫。 您需要為庫創建Android.mk
和Application.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.