2015-01-05 43 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

    我得到了帮助,通过这篇文章和总代码和流量我用...所以它的帮助 –