Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编译本机C++;与Android NDK共享对象 我已经生成了 .S/文件,通过C++在莱纳斯上得到了。因此,生成的文件现在我已经交叉编译了这个。所以文件< Android ARM >我不得不通过 Android NDK < /> >使新GealAddie。所以 可以在我的android项目中使用_Android_C++_Android Ndk - Fatal编程技术网

编译本机C++;与Android NDK共享对象 我已经生成了 .S/文件,通过C++在莱纳斯上得到了。因此,生成的文件现在我已经交叉编译了这个。所以文件< Android ARM >我不得不通过 Android NDK < /> >使新GealAddie。所以 可以在我的android项目中使用

编译本机C++;与Android NDK共享对象 我已经生成了 .S/文件,通过C++在莱纳斯上得到了。因此,生成的文件现在我已经交叉编译了这个。所以文件< Android ARM >我不得不通过 Android NDK < /> >使新GealAddie。所以 可以在我的android项目中使用,android,c++,android-ndk,Android,C++,Android Ndk,那么,谁能帮我把Linux生成的.So文件放在我的Android项目中的什么地方,以及在Make文件(Android.mk)中添加什么,这样它就可以用我以前的Linux生成的.So文件中的现有方法生成新的.So文件 我希望我的问题对你们大家都很清楚,如果不是,请告诉我 请帮帮我。首先感谢你的< P/> < P>这里是构建一个本地C++共享对象的步骤。 向项目添加本机支持。看安卓的 将您的C++文件添加到JNI文件夹 创建一个Android.mk,将其添加到JNI文件夹,并添加您想要支持的架构。例

那么,谁能帮我把Linux生成的.So文件放在我的Android项目中的什么地方,以及在Make文件(Android.mk)中添加什么,这样它就可以用我以前的Linux生成的
.So
文件中的现有方法生成新的
.So
文件

我希望我的问题对你们大家都很清楚,如果不是,请告诉我


请帮帮我。首先感谢你的< P/> < P>这里是构建一个本地C++共享对象的步骤。
  • 向项目添加本机支持。看安卓的
  • 将您的C++文件添加到JNI文件夹
  • 创建一个
    Android.mk
    ,将其添加到JNI文件夹,并添加您想要支持的架构。例如:

    APP_ABI   := armeabi x86 mips armeabi-v7a
    
    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)
    
  • < P>选择C++运行库。请参阅NDK中的CPLUSPLUS.README。我为运行时选择了STL端口(GNU运行时由于其许可证而有毒)

  • 创建一个
    Appication.mk
    ,将其添加到JNI文件夹,然后添加魔法。例如:

    APP_ABI   := armeabi x86 mips armeabi-v7a
    
    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 library”后面的内容确保我的库是根据
    STLport\u shared.so
    编译的,并且
    STLport\u shared.so
    被复制到APK中

    我的图书馆也依赖于一个图书馆。Crypto++也是根据
    stlport\u 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);
            }
        }
    }
    
    Android修改版系统真的很糟糕。它与标准的基于制造的项目有很大的不同,而且文档记录也很差。但这就是安卓所提供的,所以这就是你必须使用的。Eclipse的Android本机支持就是围绕它构建的


    如果感兴趣,下面是包装器头文件的外观。您可以使用
    javah
    从DEX文件(编译的Java类)生成它

    /*不要编辑此文件-它是机器生成的*/
    #包括
    /*类com_cryptopp_prng_prng的标头*/
    #ifndef包括加密文件
    #定义(包含)(com)(加密)(pp)(prng)(prng)
    #ifdef_uucplusplus
    外部“C”{
    #恩迪夫
    /*
    *类别:com_cryptopp_prng_prng
    *方法:加密PP_种子
    *签字:([B)I
    */
    JNIEXPORT jint JNICALL Java_com_cryptopp_prng_prng_cryptopp_1保留
    (JNIEnv*,jclass,jbyteArray);
    /*
    *类别:com_cryptopp_prng_prng
    *方法:CryptoPP_GetBytes
    *签字:([B)I
    */
    JNIEXPORT jint JNICALL Java_com_cryptopp_prng_prng_cryptopp_1GetBytes
    (JNIEnv*,jclass,jbyteArray);
    #ifdef_uucplusplus
    }
    #恩迪夫
    #恩迪夫
    
    您正在使用Eclipse吗?如果是,您是否启用了本机项目支持(已经有一段时间了,但我认为这就是它的名称)?您将需要同时使用
    Application.mk
    Android.mk
    ,但是,如果它是Eclipse.yes,我正在使用Eclipse并从中获得帮助,但我正在获得帮助。因此文件格式无法识别,我的Android项目中有Android.mk文件,而且我已启用NDK支持。您不交叉编译.so文件。您交叉编译它的源代码但是我不知道如何交叉编译源代码。不可能交叉编译.so文件吗.so文件包含编译它的系统的机器代码。你需要交叉编译,就像你想创建一个本机可执行文件一样。如果你不知道/理解如何做,你需要查找一般来说,如何为android交叉编译。我通过这篇文章以及我使用的全部代码和流程获得了帮助…所以helpful@NehaShukla,如何仅从命令提示符编译.so文件?