小编Syn*_*tix的帖子

想要编译本机Android二进制文件我可以在手机终端上运行

我已经尝试了几天来编译一个本机ARM Android二进制文件,它将使用终端应用程序在我的手机上执行.我想生成与手机上安装的标准Posix二进制文件相同类型的二进制文件,如ls,mkdir等.我已经在Mac OS X下载了Android NDK,并且能够无错误地编译简单的ELF二进制文件.但是,当我将它们转移到手机时,它们总是会出现段错误.也就是说,在GCC中使用-static编译时会出现段错误.如果我不使用-static,他们会抱怨没有链接等等.简单来说,它们不起作用.

我的假设是它们没有正确链接到Android标准C库.即使我将我的二进制文件与NDK提供的libc链接,它们仍然无法正常工作.我读到Android使用Bionic C库,并尝试下载它的源代码,但我不知道如何从它构建一个库(它似乎是所有ARM程序集).

手机上的Android C库是否与Android NDK提供的库不同?包含在NDK中的那个不允许我编译我可以通过终端执行的本机二进制文件吗?非常感谢任何指导!

更新:

我终于在Mac OS X上使用GCC 4.7.0了解它.我下载了Bionic标头,然后使用Android NDK附带的C库编译了一个动态链接的二进制文件.我能够使用手机的C lib(二进制为33K)获得一个测试应用程序在手机上工作.我还尝试静态链接NDK的C库,这也很有用.

为了使这一切正常工作,我必须将-nostdlib传递给GCC,然后手动将crtbegin_dynamic.o和crtend_android.o添加到GCC的命令行.它的工作原理如下:

$CC \
$NDK_PATH/usr/lib/crtbegin_dynamic.o \
hello.c -o hello \
$CFLAGS \
$NDK_PATH/usr/lib/crtend_android.o
Run Code Online (Sandbox Code Playgroud)

对于静态二进制文件,请使用"crtbegin_static.o".这在crtbegin_dynamic.S/crtbegin_static.S源中进行了解释.

对于这个实验,我只使用普通的'ol GCC 4.7.0和Binutils 2.22.我还使用newlib编译了GCC,但我实际上并没有将我的ARM二进制文件与newlib链接起来.我强迫GCC/ld直接链接到随Android NDK提供的libc,或者在动态二进制文件的情况下,链接到手机上的libc.

c android gcc arm android-ndk

32
推荐指数
2
解决办法
3万
查看次数

使用newlib为ARM交叉编译GCC:如何指定像-march这样的GCC选项?

我在Mac OS X上为ARM目标编译了GCC和newlib.但是,libc.a是用-fshort-enums编译的,我不希望这样,因为当我为ARM编译东西时,我使用-fno-short-enums.这当然是冲突:

ld: warning: /var/folders/9m/2wnjp9zd71x13cpdpf16y_4r0000gn/T//ccQuEnp6.o uses 32-bit enums yet the output is to use variable-size enums; use of enum values across objects may fail
Run Code Online (Sandbox Code Playgroud)

每当我尝试运行"你好,世界!" 可执行文件,它是段错误的.这可能是原因吗?

这是我用来编译hello.c的命令:

arm-eabi-gcc \
hello.c -o hello \
/Users/user/gcc-arm-install/arm-eabi/lib/crt0.o \
/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/crtbegin.o \
/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/crti.o \
/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/crtn.o \
/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/crtend.o \
-v -nostdinc -nostdlib -static \
-march=armv7-a -mno-thumb-interwork -marm -mfpu=neon -mfloat-abi=softfp -fpic \
-ffunction-sections -fno-short-enums -fno-rtti -fno-exceptions \
-I/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/include \
-I/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/include-fixed \
-I/Users/user/gcc-arm-install/arm-eabi/include \
-I/Users/user/gcc-arm-install/arm-eabi/sys-include \
-L/Users/user/gcc-arm-install/arm-eabi/lib \
-L/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0 \
-lm -lc -lgcc
Run Code Online (Sandbox Code Playgroud)

更新:

好吧,我想我已经将问题缩小到newlib的libc和启动文件(crt0.o)的组合.我尝试使用libc.a和来自Android NDK的启动文件使用GCC 4.7.0编译测试应用程序,并且在编译静态时在手机上工作.事实上,即使ld再次抱怨使用"可变大小的枚举"(即,不使用-fno-short-enums编译其他所有内容),它仍然有效.所以,我关于-fno-short-enums是我之前崩溃的二进制文件的罪魁祸首的假设是不正确的. …

c macos android gcc arm

31
推荐指数
1
解决办法
8500
查看次数

我真的需要libgcc吗?

我一直在Mac OS X 10.6上使用GCC 4.6.2.我在编译时使用-static-libgcc选项,否则我的二进制文件在系统上查找libgcc并且我不确定OS X上是否支持GCC 4.2.这样可以正常工作,但为什么我甚至需要libgcc?我读了它并且GNU文档说它包含"目标处理器不能直接执行的算术运算".我怎么知道这些操作是什么?为什么它们如此复杂以至于我需要包含这个库?为什么GCC不能直接优化代码而不必诉诸这些库函数?我有点困惑.对此有任何见解将不胜感激!

c macos cocoa gcc

16
推荐指数
1
解决办法
1万
查看次数

如何修改非常大的 zip 中的单个文件而不重写整个 zip?

我有包含巨大文件的大型 zip 文件。zip 存档中有一些需要修改的“元数据”文本文件。但是,无法提取整个 zip 并重新压缩它。我需要在 zip 中找到目标文本文件,对其进行编辑,并可能将更改附加到 zip 文件中。文本文件的文件名始终相同,因此可以进行硬编码。这可能吗?有没有更好的办法?

c compression zip posix

8
推荐指数
2
解决办法
1万
查看次数

启动时是否将整个静态程序加载到内存中?

在Mac,Windows,Linux,iOS等典型计算机上,当用户启动程序/二进制/应用程序时,程序的静态部分是否始终在执行开始之前完全加载到内存中?这是否包括程序中的所有数据段/部分,如字符串和任何其他嵌入式BLOB数据?假设我将一个巨大的图像文件嵌入到二进制文件中(例如在__DATA段中).这些图像数据在发布时是否会完全加载到内存中?

c linux windows macos assembly

7
推荐指数
1
解决办法
2280
查看次数

AVFoundation的AVAssetWriterInput究竟是什么期望MediaDataInRealTime属性呢?

我正在开发一个从磁盘读取媒体数据的应用程序,将其转换为适当的像素格式,然后将其传递给AVAssetWriter进行压缩并写入磁盘.我正在自己读取交错而不使用AVAssetReader.我的读者确保以串行方式呈现恰好一帧的视频数据和一帧的音频数据.我遇到的问题是如果我没有将expectedMediaDataInRealTime属性设置为YES,视频资产编写器将始终返回NO正好在30帧之后的isReadyForMoreMediaData.如果我在30帧之前停止写入,它工作正常,输出文件有效.但是,如果我将expectedMediaDataInRealTime设置为YES,它可以在整个持续时间内完美运行,可以是几千帧.在expectMediaDataInRealTime设置为YES的情况下启动转码操作后,我在压缩一个非常长的视频的过程中观察了应用程序的内存使用情况,并且没有任何不合理的内存使用情况,也没有任何内存泄漏.并且所得到的MOV文件看起来确实写得相当正常,例如音频数据与视频数据交错,如人们所期望的那样.

那么,如果设置为YES没有明显的缺点,为什么我会将expectedMediaDataInRealTime设置为NO?这仅适用于使用Apple API读取数据(使用AVAssetReader)吗?文档说该属性控制"以理想的交错模式写入媒体数据以提高存储和回放效率",但是当expectedMediaDataInRealTime设置为YES时,isReadyForMoreMediaData永远不会返回NO并且文件看起来写得很完美.因此,如果AVAssetWriter在此属性设置为YES时可以执行此操作,为什么设置为NO时无法执行此操作?来源完全一样.

除了"确保readyForMoreMediaData的值被恰当地计算"之外,这个属性究竟做了什么呢(这对我来说绝对没有意义)?

macos video cocoa objective-c avfoundation

6
推荐指数
1
解决办法
1655
查看次数

需要将一个XMM寄存器与另一个XMM寄存器相乘,但需要使用位掩码值

在x86/SIMD程序集中,我已经填充了一个XMM寄存器,其中包含我需要转换的四个32位像素的图形图像.但是,像素采用10位打包RGB格式,因此它们以32位的形式存在:

[  red   ][  green ][  blue  ][]
RRRRRRRRRRGGGGGGGGGGBBBBBBBBBB00
Run Code Online (Sandbox Code Playgroud)

最后两位是填充位,未使用.

我需要将这些像素乘以另一个值,但是需要屏蔽该值,因此它只影响红色像素.该值是常量,因此可以进行硬编码.假设该值为0.1234.如何通过适当的屏蔽将其放入另一个XMM寄存器中,以便它只影响每个32位段的红色部分?

以图形方式说明,我想做这样的事情:

XMM0 (first 32 bit segment):
[ 0.1234 ][  1.0   ][  1.0   ][]

*

XMM1 (first 32 bit segment):
RRRRRRRRRRGGGGGGGGGGBBBBBBBBBB00
Run Code Online (Sandbox Code Playgroud)

结果是XMM0和XMM1的乘积.当然,这个32位段将在整个XMM寄存器中重复,我只是在这里指定了前32位,所以你明白了.

c graphics optimization assembly

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

无法在AlertDialog内以编程方式更改EditText边距

我的应用程序中有一个包含EditText字段的AlertDialog.此对话框需要以编程方式生成,并且应与当用户通过触摸EditTextPreference编辑文本时由Android自动显示的EditTextPreference对话框外观相匹配.这一切都有效,但以编程方式插入的EditText的大小太宽,与触摸时EditTextPreference显示的大小不匹配.以下两个图像显示了该问题.

使用setView()添加到AlertDialog时,EditText看起来像这样:

使用setView()添加到AlertDialog时,EditText看起来像这样

但应该看起来像这样:

应该是这样的

以下是XML中负责EditTextPreference的XML代码:

<EditTextPreference
            android:title="Enter Name"
            android:key="name"
            android:defaultValue=""
            android:summary=""
            android:inputType="textCapSentences|textMultiLine"
            android:singleLine="false"
            android:gravity="top|left"
            android:lines="2"
            android:minLines="1"
            android:maxLines="2"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:scrollbars="vertical"
            />
Run Code Online (Sandbox Code Playgroud)

以及负责我的对话的Java代码:

AlertDialog.Builder alertDialog = new AlertDialog.Builder(mainActivity);
alertDialog.setTitle("Enter Date");

final EditText input = new EditText(mainActivity);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT);
input.setLayoutParams(lp);
input.setGravity(android.view.Gravity.TOP|android.view.Gravity.LEFT);
input.setInputType(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES|InputType.TYPE_TEXT_FLAG_MULTI_LINE);
input.setLines(1);
input.setMaxLines(1);
input.setText(lastDateValue);
alertDialog.setView(input);
Run Code Online (Sandbox Code Playgroud)

java android android-layout android-alertdialog

5
推荐指数
2
解决办法
3586
查看次数

如何将光流场(浮点)映射到像素数据(char)以进行图像变形?

我一直在玩OpenCV中的光流功能而且卡住了.我已经使用Farneback方法成功生成了X和Y光流场/地图,但我不知道如何将其应用于输入图像坐标以扭曲图像.生成的X和Y字段是32位浮点类型(0-1.0),但这如何转换为输入和输出图像的坐标?例如,1.0是什么?图像的宽度?两者的区别?

另外,我不确定应用transform/warp的循环是什么样的.我已经做了很多循环来改变颜色,但像素总是保持在同一个位置.移动像素对我来说是新的领域!

更新:我得到了这个工作,但结果图像很乱:

//make a float copy of 8 bit grayscale source image
IplImage *src_img = cvCreateImage(img_sz, IPL_DEPTH_32F, 1);
cvConvertScale(input_img,src_img,1/255.0); //convert 8 bit to float

//create destination image
IplImage *dst_img = cvCreateImage(img_sz, IPL_DEPTH_32F, 1);

for(y = 0; y < flow->height; y++){

    //grab flow maps for X and Y
    float* vx = (float*)(velx->imageData + velx->widthStep*y);
    float* vy = (float*)(vely->imageData + vely->widthStep*y);

    //coords for source and dest image
    const float *srcpx = (const float*)(src_img->imageData+(src_img->widthStep*y));
    float *dstpx = (float*)(dst_img->imageData+(dst_img->widthStep*y));

    for(x=0; x < flow->width; …
Run Code Online (Sandbox Code Playgroud)

c c++ graphics opencv image-processing

3
推荐指数
1
解决办法
4036
查看次数

想要构建只有内核和一个二进制文件的裸Linux系统

我想构建一个只运行一个二进制程序的专用Linux系统.该程序通过OpenGL驱动程序控制屏幕并显示模式.还需要键盘输入来配置模式.由于运行这一个程序将是机器的唯一目的,我不需要任何GUI,网络等.此外,我可能不需要在内核中进行任何进程调度,因为只有一个进程将运行.

有可能用我自己的二进制文件替换/ sbin/init来实现这个目的吗?在内核加载之后,它会立即执行我自己的二进制文件,这将在机器运行的整个时间内运行.基本上,我想模仿微控制器的工作方式,但能够使用具有不同硬件设备和驱动程序的x86 CPU.

c linux hardware kernel linux-kernel

3
推荐指数
2
解决办法
1727
查看次数

即使我明确地释放它,循环中的NSMutableArray也会泄漏内存

这个循环泄漏内存:

int64_t i,verylongnumber;

//misc. code

for(i=0;i<verylongnumber;i++){
    NSMutableArray *myArray = [[NSMutableArray alloc] initWithObjects:
            [NSNumber numberWithLongLong:65535],
            [NSNumber numberWithLongLong:65535],
            [NSNumber numberWithLongLong:65535],
            [NSNumber numberWithLongLong:65535],
            nil];
    [myArray removeAllObjects];
    [myArray release];
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试了一切,以防止泄漏记忆,但我不能.我认为它与NSNumbers有关.我假设它们是自动释放的,但这是否意味着我必须单独释放它们(即使用alloc)?我怎么会这样做?为每个NSNumber创建一个单独的变量并将其插入到数组中?这似乎很多工作.我尝试了[myArray removeAllObjects],但这并没有什么区别.它在我自己的线程内有自己的自动释放池.我不确定这是否有所作为.

这解决了它:

我在循环中添加了一个额外的自动释放池:

int64_t i,verylongnumber;

//misc. code

for(i=0;i<verylongnumber;i++){

    NSAutoreleasePool *pool2 = [[NSAutoreleasePool alloc] init];

    NSMutableArray *myArray = [[NSMutableArray alloc] initWithObjects:
            [NSNumber numberWithLongLong:65535],
            [NSNumber numberWithLongLong:65535],
            [NSNumber numberWithLongLong:65535],
            [NSNumber numberWithLongLong:65535],
            nil];
    [myArray release];

    [pool2 drain];
}
Run Code Online (Sandbox Code Playgroud)

macos cocoa objective-c

2
推荐指数
1
解决办法
651
查看次数

可以直接在文件系统中构建对应用程序的支持吗?

我想知道是否可以编写一个将访问外部文件系统的应用程序,但不需要从操作系统支持该文件系统.例如,我想用C语言编写一个在Mac OS X上运行的应用程序,它可以从ext2/ext3格式的磁盘中浏览/复制文件.当然,你必须通过应用程序进行所有传输(不是通过使用cp或Finder的系统),但这对我的目的来说是可以的.这可能吗?

c linux filesystems macos

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