繁体   English   中英

使用Android NDK编译本机C ++共享库

[英]Compile native C++ shared object with Android NDK

我已经在Linus上通过C ++生成了一个.so文件,并生成了.so文件,现在我已经为Android ARM交叉编译了该.so文件,因此我必须通过Android NDK对其进行修饰,以便新生成的.so可以在我的android中使用项目。

所以任何人都可以帮助我在Linux项目中放置Linux生成的.so文件的位置以及在Make文件(Android.mk)中添加的内容,以便它可以使用我以前的Linux生成的.so现有方法生成新的.so文件。文件。

我希望我的问题对大家都清楚,否则请告诉我。

请帮我。 提前致谢

以下是构建本机C ++共享对象的步骤。

  1. 向您的项目添加本地支持。 请参阅Android的添加本机支持
  2. 将您的C ++文件添加到JNI文件夹
  3. 创建一个Android.mk ,将其添加到JNI文件夹,然后添加您要支持的架构。 例如:

     APP_ABI := armeabi x86 mips armeabi-v7a 
  1. 选择一个C ++运行时库。 请参阅NDK中的CPLUSPLUS.README。 我为运行时选择了STL Port(由于其许可,GNU运行时是有毒的)。

  2. 创建一个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中。

我的库还依赖于Crypto ++交叉编译版本 还针对stlport_shared.so编译/链接了Crypto ++。 “ Crypto ++库”后面的内容可确保针对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修改过的构建系统确实很糟糕。 它与基于标准的基于Make的项目有很大的不同,并且记录不充分。 但这就是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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM