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