小编cen*_*lug的帖子

如何编译和链接生锈代码到Android apk打包应用程序

我正在尝试将Rust代码添加到android NDK示例(native-activity); 每当我将Rust代码(编译为.a)链接到.so时,它都无法运行.

我从这里获取信息,以获得一个知识渊博的防锈编译器和'独立工具链' https://github.com/mozilla/rust/wiki/Doc-building-for-android

有人在Rust IRC频道上建议我需要在某处提到"拇指"; 是否可以选择传递给rustc,或者我是否必须首先以不同的方式构建它?

我当然能够在桌面版本上调用另外的rust&c.

是否有人在.apk中使用锈蚀代码; 它必须简单..很难破解复杂项目的makefile.(我认为通过阅读伺服源来解决这个问题非常困难)

我已经证实这个过程可以生成一个可用的包装而不会生锈; 如果我链接未经剥离的防锈代码 - 即使没有达到(即使链接没有告诉我任何错误),它也无法运行 .如果我删除对'rusty_android()'的调用,它就可以了.如果我将对garbage_android的调用移动到未到达的点,它仍然无效.我可以用'nm'验证'rusty_android'是否在.so ...中没有.

这是我目前的构建过程:它取自android native-activity示例; 我添加了一个带有单个extern功能的锈源文件,返回一个值,并尝试从样本的C main调试打印

ANDROID_CXX  = /opt/ndk_standalone/bin/arm-linux-androideabi-gcc

android:
    $(ANDROID_CXX) -I/home/ME/android-ndk-r9b/sources/android/native_app_glue -c jni/main.c  -o obj/local/armeabi/objs/native-activity/main.o
    rustc --target=arm-linux-androideabi hello_android.rs -C android-cross-path=/opt/ndk_standalone --crate-type=staticlib -o rusty_android.a
    $(ANDROID_CXX) -shared -o libs/armeabi/libnative-activity.so obj/local/armeabi/objs/native-activity/main.o obj/local/armeabi/libandroid_native_app_glue.a another.o rusty_android.a -llog -landroid -lEGL -lGLESv1_CM
   ant debug
   adb install -r bin/NativeActivity-debug.apk
   adb shell am start -n com.example.native_activity/android.app.NativeActivity




hello_android.rs:-

use std::libc;
#[no_mangle]
pub extern fn   rusty_android()->libc::c_int {
99 as libc::c_int
} …
Run Code Online (Sandbox Code Playgroud)

android arm thumb android-ndk rust

14
推荐指数
1
解决办法
4093
查看次数

std :: array alignment

尝试std::tr1::array在mac上我得到16字节对齐.

sizeof(int) = 4;  
sizeof( std::tr1::array< int,3 > ) = 16;  
sizeof( std::tr1::array< int,4 > ) = 16;    
sizeof( std::tr1::array< int,5 > ) = 32;
Run Code Online (Sandbox Code Playgroud)

STL中是否有任何行为类似于数组<T,N>,但保证不会自行填充,即

sizeof( ARRAY< T, N> ) = sizeof(  T )*N  
Run Code Online (Sandbox Code Playgroud)

c++ arrays vector alignment padding

9
推荐指数
1
解决办法
2557
查看次数

紧凑的偏移指针,现有的实现?

是否存在stl,boost或其他LGPL开源工具包中的模板,其行为完全如下: -
具有自定义对齐的相对指针,用于存储较少位以减小范围的选项.可能的实施说明: -

template<typename T, typename OFFSET=int, 
    int ALIGN_SHIFT=2>
class   OffsetPtr 
{
    OFFSET  ofs;

public:
    T* operator->() {
        return  (T*) (((((size_t)this)>>ALIGN_SHIFT)+ofs)<<ALIGN_SHIFT);
    };
    void operator=(T* src) {
        size_t ofs_shifted = (((size_t) src)>>ALIGN_SHIFT) - (((size_t) this)>>ALIGN_SHIFT); //asserts..
        ofs = (OFFSET) (ofs_shifted);
    }
    //...
};
Run Code Online (Sandbox Code Playgroud)

它是我过去常规创建的东西(紧凑缓存友好的预编译数据结构),例如,数据分成子128k块OFFSET = short
另一种我在古代C#defines中使用的变体将使用来自头部的偏移量,其中对齐会更有用.

我已经看到了一些关于在具有"offset_ptr",这看起来非常相似升压的"间图书馆",所以它很可能有一个现有的执行,包括这一确切模式的地方.编写起来很快,但现有实现可能会带来好处,例如围绕相同概念构建的一组相关的stl兼容数据结构 - 例如具有16位偏移指针和16位计数的"近矢量"

c++ boost pointers stl

5
推荐指数
1
解决办法
908
查看次数

标签 统计

c++ ×2

alignment ×1

android ×1

android-ndk ×1

arm ×1

arrays ×1

boost ×1

padding ×1

pointers ×1

rust ×1

stl ×1

thumb ×1

vector ×1