2015-01-05 72 views
2

我已經產生上萊納斯通過C++一個.so文件並得到現在.so文件生成的I具有交叉編譯此.so文件Android ARM所以我經由Android NDK到comiple它使得新genrated .so 與Android NDK共享對象可以在我的android項目中使用。編譯本地C++

那麼,任何人都可以幫助我在哪裏必須將Linux生成的.so文件放入我的Android項目中,以及在Make文件(Android.mk)中添加什麼,以便可以在我以前的Linux中使用現有方法生成新的.so文件生成.so文件。

我希望我的問題對你們都清楚,如果不是,請告訴我。

請幫幫我。在此先感謝

+0

您使用的是Eclipse嗎?如果是這樣,你是否啓用本地項目支持(它已經有一段時間了,但我認爲這就是它所稱的)?不過,如果使用Eclipse,則需要同時使用'Application.mk'和'Android.mk'。 – jww

+0

是的,我使用的是Eclipse,我從http://stackoverflow.com/questions/9870435/how-can-i-link-prebuilt-shared-library-to-android-ndk-project接受了幫助,但是我得到了.so文件格式不被識別,我的Android項目中有Android.mk文件,而且我也啓用了NDK支持 –

+0

您不會交叉編譯.so文件。你交叉編譯它的_source code_。 – Michael

回答

3

以下是構建本機C++共享對象的步驟。

  1. 爲您的項目添加本機支持。見Android的Add native support
  2. 你的C++文件添加到文件夾JNI
  3. 創建Android.mk,將其添加到該文件夾​​JNI,並添加你想要支持的架構。例如:

    APP_ABI := armeabi x86 mips armeabi-v7a 
    
  • 選擇一個C++運行庫。請參閱NDK中的CPLUSPLUS.README。我爲運行時選擇了STL端口(由於其許可,GNU運行時是有毒的)。

  • 創建一個Appication.mk,將其添加到JNI文件夾,並添加魔術。例如:

    LOCAL_PATH := $(call my-dir) 
    
    # NDK_DEBUG_IMPORTS := 1 
    
    ######################################################### 
    # STLport library 
    include $(CLEAR_VARS) 
    
    STLPORT_INCL  := /opt/android-ndk-r9/sources/cxx-stl/stlport/stlport 
    STLPORT_LIB  := /opt/android-ndk-r9/sources/cxx-stl/stlport/libs/$(TARGET_ARCH_ABI) 
    
    LOCAL_MODULE := stlport_shared 
    LOCAL_SRC_FILES := $(STLPORT_LIB)/libstlport_shared.so 
    
    LOCAL_EXPORT_CPPFLAGS := 
    LOCAL_EXPORT_C_INCLUDES := $(STLPORT_INCL) 
    
    include $(PREBUILT_SHARED_LIBRARY) 
    
    LOCAL_SHARED_LIBRARIES := stlport_shared 
    
    ######################################################### 
    # Crypto++ library 
    include $(CLEAR_VARS) 
    
    CRYPTOPP_INCL := /usr/local/cryptopp/android-$(TARGET_ARCH_ABI)/include 
    CRYPTOPP_LIB := /usr/local/cryptopp/android-$(TARGET_ARCH_ABI)/lib 
    
    LOCAL_MODULE  := cryptopp 
    LOCAL_SRC_FILES := $(CRYPTOPP_LIB)/libcryptopp.so 
    
    LOCAL_EXPORT_CPPFLAGS := -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function 
    LOCAL_EXPORT_C_INCLUDES := $(CRYPTOPP_INCL) $(CRYPTOPP_INCL)/cryptopp 
    
    include $(PREBUILT_SHARED_LIBRARY) 
    
    LOCAL_SHARED_LIBRARIES := cryptopp 
    
    ######################################################### 
    # PRNG library 
    include $(CLEAR_VARS) 
    
    APP_STL   := stlport_shared 
    APP_MODULES  := prng stlport_shared cryptopp 
    
    # My ass... LOCAL_EXPORT_C_INCLUDES is useless 
    LOCAL_C_INCLUDES := $(STLPORT_INCL) $(CRYPTOPP_INCL) 
    
    LOCAL_CPP_FEATURES := rtti exceptions 
    
    LOCAL_CPP_FLAGS := -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function 
    LOCAL_CPP_FLAGS += -Wl,--exclude-libs,ALL 
    
    LOCAL_LDLIBS   := -llog -landroid 
    LOCAL_SHARED_LIBRARIES := cryptopp stlport_shared 
    
    LOCAL_MODULE := prng 
    LOCAL_SRC_FILES := libprng.cpp 
    
    include $(BUILD_SHARED_LIBRARY) 
    
  • 我的圖書館取決於STLport的。 「STLport庫」確保我的庫符合stlport_shared.so編譯,並且stlport_shared.so被複制到APK中。

    我的圖書館也取決於cross-compiled version of Crypto++。 Crypto ++也編譯/鏈接到stlport_shared.so「Crypto ++ library」後面的內容確保我的庫針對libcryptopp.so進行編譯,並且libcryptopp.so被複制到APK中。

    最後,我的圖書館被叫出。我的圖書館是「PRNG圖書館」(它是一個單獨的文件測試項目)。它構建libprng.so,並確保libprng.so被複制到APK中。

    您還需要Android類。這是我的樣子。

    package com.cryptopp.prng; 
    
    public class PRNG { 
    
        static { 
         System.loadLibrary("stlport_shared"); 
         System.loadLibrary("cryptopp"); 
         System.loadLibrary("prng"); 
        } 
    
        private static native int CryptoPP_Reseed(byte[] bytes); 
    
        private static native int CryptoPP_GetBytes(byte[] bytes); 
    
        private static Object lock = new Object(); 
    
        // Class method. Returns the number of bytes consumed from the seed. 
        public static int Reseed(byte[] seed) {   
         synchronized (lock) { 
          return CryptoPP_Reseed(seed); 
         } 
        } 
    
        // Class method. Returns the number of bytes generated. 
        public static int GetBytes(byte[] bytes) { 
         synchronized (lock) { 
          return CryptoPP_GetBytes(bytes); 
         } 
        } 
    
        // Instance method. Returns the number of bytes consumed from the seed. 
        public int reseed(byte[] seed) { 
         synchronized (lock) { 
          return CryptoPP_Reseed(seed); 
         } 
        } 
    
        // Instance method. Returns the number of bytes generated. 
        public int getBytes(byte[] bytes) { 
         synchronized (lock) { 
          return CryptoPP_GetBytes(bytes); 
         } 
        } 
    } 
    

    Android修改的構建系統真的很糟糕。它與標準的基於製作的項目有很大不同,且記錄不完整。但這就是Android提供的,所以這就是你必須使用的。 Eclipse的Android本機支持就是圍繞它構建的。


    如果有興趣,這是什麼封裝頭文件看起來像。您可以使用javah從您的DEX文件(已編譯的Java類)生成它。

    /* DO NOT EDIT THIS FILE - it is machine generated */ 
    #include <jni.h> 
    /* Header for class com_cryptopp_prng_PRNG */ 
    
    #ifndef _Included_com_cryptopp_prng_PRNG 
    #define _Included_com_cryptopp_prng_PRNG 
    #ifdef __cplusplus 
    extern "C" { 
    #endif 
    /* 
    * Class:  com_cryptopp_prng_PRNG 
    * Method: CryptoPP_Reseed 
    * Signature: ([B)I 
    */ 
    JNIEXPORT jint JNICALL Java_com_cryptopp_prng_PRNG_CryptoPP_1Reseed 
        (JNIEnv *, jclass, jbyteArray); 
    
    /* 
    * Class:  com_cryptopp_prng_PRNG 
    * Method: CryptoPP_GetBytes 
    * Signature: ([B)I 
    */ 
    JNIEXPORT jint JNICALL Java_com_cryptopp_prng_PRNG_CryptoPP_1GetBytes 
        (JNIEnv *, jclass, jbyteArray); 
    
    #ifdef __cplusplus 
    } 
    #endif 
    #endif 
    
    +0

    感謝讓我試試 –

    +0

    @NehaShukla:這是否有效? – Palak

    +0

    我得到了幫助,通過這篇文章和總代碼和流量我用...所以它的幫助 –