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

Neh*_*kla 2 c++ android android-ndk

我已经.so在Linus上通过C++ 生成了一个文件并且.so现在生成了文件我已经交叉编译了这个.so文件,Android ARM所以我必须通过它来编辑它Android NDK以便.so 在我的android项目中使用新的genrated .

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

我希望我的问题清楚,如果不是,请告诉我.

请帮我.提前致谢

jww*_*jww 5

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

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

    APP_ABI   := armeabi x86 mips armeabi-v7a
    
    Run Code Online (Sandbox Code Playgroud)
  1. 选择一个C++运行时库.请参阅NDK中的CPLUSPLUS.README.我为运行时选择了STL端口(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)
    
    Run Code Online (Sandbox Code Playgroud)

我的图书馆依赖于STLport.下面的东西"的STLport库",确保我的库一起编译stlport_shared.so,并stlport_shared.so复制到APK.

我的库还依赖于Crypto ++交叉编译版本.Crypto ++也被编译/链接stlport_shared.so.东西以下"的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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)