`
lixinye0123
  • 浏览: 332234 次
  • 性别: Icon_minigender_1
  • 来自: 温州
社区版块
存档分类
最新评论

制作 cygwin 环境下的 Cross tool chain

阅读更多
 

Google Android

Android is the first free, open source, and fully customizable mobile platform. Android offers a full stack: an operating system, middleware, and key mobile applications. It also contains a rich set of APIs that allows third-party developers to develop great applications.

制作 cygwin 环境下的 Cross tool chain

在完全开源前,很多开发者在用 CodeSourceryGNU Toolchains for ARM 。现在简单了,下载到源码后,在 prebuild 目录下就有完整的 toolchain 用了。如果需要在其他系统环境下使用,可以去下载 android-toolchain-20081019.tar.bz2 源码重新编译。在 cygwin 下编译时,先检查一下 gcc make Flex bison gettext-devel 等是否装全(编译过程中会用到 msgfmt 命令,cygwin 把它放到 gettext-devel 包里了),然后按照其 readme.txt 里的 linux 方式编译就可以了。cgywin 下有时会出现文件写失败的错误,用 chmod +w 修改即可解决。
在 <android source>/build/core/combo 目录下的 linux-arm.mk 文件对我们来说非常有帮助,其中 C_INCLUDES 描述 C 语言的所有头文件位置,在 android source 里找到这些目录,并复制到新编译好的 <toolchain>/arm-eabi/include 目录下,动态库在编译过的 <android source>/out/target/product/generic/system/lib  目录下,也可以从 Android SDK 的模拟器中 /system/lib 下找到这些文件,并复制到 <toolchain>/arm-eabi/lib 目录下。在 <android source>/build/core 下有 armelf.x armelf.xsc ,是以后编译必须的连接脚本。在 <android source>/out/target/product/generic/obj/lib 下的 crtbegin_static.o crtbegin_dynamic.o crtend_android.o  编译时还要根据自己情况选择并连接到可执行文件中去,当然也可以在程序 main 函数后加如下函数代替。
 
      void _start(int argc, char **argv) { exit( main(argc, argv) ); }

 
First native C application on android

制作好了 toolchain ,就可以写个 hello.c 测试一下了。代码如下:

#include <stdio.h>
int main(int argc, char **argv)
{
printf("Hello World!\n");
return 0;
}

编译命令:

$ arm-eabi-gcc -nostdlib -Bdynamic -Wl,-T,armelf.x -Wl,-dynamic-linker,/system/bin/linker \
-include AndroidConfig.h -lc -o hello hello.c crtbegin_dynamic.o crtend_android.o
$ adb push hello /data
$ adb shell chmod 777 /data/hello
$ adb shell /data/hello
Hello World!
$

哈哈,Android 之旅开始了…


Shared library for android


接下来测试 shared library ,编写代码 libhello.c :

#include <stdio.h>
int sayhello(char *name)
{
printf("Hello %s\n", name);
return 0x12345;
}

编写代码 hello2.c :

extern int sayhello(char *name);
int main(int argc, char **argv)
{
sayhello("World!");
return 0;
}

编译代码及测试运行:

$ arm-eabi-gcc -nostdlib -Wl,-T,armelf.xsc -Wl,-shared,-Bsymbolic -lc -o libhello.so libhello.c
$ arm-eabi-gcc -nostdlib -Bdynamic -Wl,-T,armelf.x -Wl,-dynamic-linker,/system/bin/linker \
  -L./ -lc -lhello -o hello2 hello2.c crtbegin_dynamic.o crtend_android.o
$ adb push libhello.so /data
$ adb push hello2 /data
$ adb shell chmod 777 /data/hello2
$ adb shell /data/hello2
Hello World!
$

呵呵,又迈进一步 ...


The Java Native Interface (JNI) for Android
 
在 eclipse 里新建一个 android 项目,新增加一个类 hello.java :

package cn.oopsware.hello;

public class hello {
static {
try {
System.load("/data/lib/libhello_jni.so");
} catch (Exception e) {}
}
public native int test1();
public native int test2(int[] name);
}

修改主程序
onCreate 的代码,用来调用显示结果:

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
hello h = new hello();
TextView tv = new TextView(this);
tv.setText( Integer.toHexString( h.test1() ) );
setContentView(tv);
}

android 使用的 JNI 头文件在目录 <android source>/dalvik/libnativehelper/include/nativehelper 下。也许是为了提高 android 映射库函数的速度,android 另加了两个函数,在加载和释放库时被VM调用,即:jint JNI_OnLoad(JavaVM* vm, void*)  和 void JNI_OnUnload(JavaVM* vm, void*)  。通过
JNIEnv 的 RegisterNatives 用法把一个 JNINativeMethod 数组注册到 VM 。<android source>/dalvik/libcore/dalvik/src/main 加有个简单的例子,可以帮助理解 JNINativeMethod 中 signature 的写法。共享库代码 libhello_jni.c :

#include "jni.h"

static int test1(JNIEnv* env, jclass clazz)
{
return 0x654321;
}

static int test2(JNIEnv* env, jclass clazz, jarray a)
{
return 0x765432;
}

#define gClassName "cn/oopsware/hello/hello"

static JNINativeMethod gMethods[] = {
/* name, signature, funcPtr */
{ "test1",  "()I",  test1 },
{ "test2",  "([I)I", test2 },
};

jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
JNIEnv *env;
jclass cls;
if ( (*vm)->GetEnv(vm, (void **) &env, JNI_VERSION_1_4) ) return JNI_ERR;
cls = (*env)->FindClass(env, gClassName);
(*env)->RegisterNatives(env, cls, &gMethods[0], 2);
return JNI_VERSION_1_4;
}

void JNI_OnUnload(JavaVM* vm, void* reserved)
{
JNIEnv *env;
jclass cls;
if ((*vm)->GetEnv(vm, (void **) &env, JNI_VERSION_1_4)) return;
cls = (*env)->FindClass(env, gClassName);
(*env)->UnregisterNatives(env, cls);
}

编译并上传到模拟器:

$ arm-eabi-gcc -nostdlib -Wl,-T,armelf.xsc -Wl,-shared,-Bsymbolic \
-lc -o libhello_jni.so hello_jni.c

$ adb push libhello_jni.so data/bin/libhello_jni.so

在 eclipse 里运行 android 项目,即可看到正确结果。测试代码及编译好的测试.so 和 .apk,可下载下面的附件 jni_test.zip 。

附件 (1)

  • jni_test.zip 11k - 创建时间 2008-12-20 上午5:55,创建人 Du Qiang (版本 1)
分享到:
评论

相关推荐

    cross-tool 的官方文档

    - **Cygwin**:阐述了在 Cygwin 环境下的构建流程。 - **Solaris**:概述了 Solaris 系统上的构建指南。 #### 六、目标平台注意事项 - **MIPS**:针对 MIPS 架构的构建注意事项。 - **SH3/SH4**:关于 SH3 和 SH4 ...

    在Windows上的Cygwin环境上安装Hadoop指南

    下面将详细介绍在Windows上的Cygwin环境下安装Hadoop的步骤,并解决一些常见问题。 首先,我们需要下载并安装Cygwin。访问Cygwin官方网站,选择适合你的Windows系统的安装包。在安装过程中,记得选择"Devel"类别下...

    Windows下的Linux编译环境cygwin

    描述:“一个很好用的工具,在windows环境下调试Linux下的程序,Windows下的Linux编译环境cygwin,在程序移植上很有帮助” 标签:“Windows下的Linux编译环境 cygwin” Cygwin是一个强大的开源工具集,它为Windows...

    Cygwin 下的NS3安装心得

    在本文中,我们将深入探讨如何在Cygwin环境下安装NS3,特别关注如何解决在安装RFID模块时遇到的问题。NS3(网络模拟器3)是一个开源的、跨平台的网络模拟软件,广泛用于研究和教学。在Windows操作系统上,通过Cygwin...

    iphone开发环境 windows篇之 cygwin + toolschain

    在本文中,我们将深入探讨如何在Windows环境下搭建用于iPhone应用开发的Cygwin+Toolchain环境。虽然这并不构成一个完整的开发环境,但它为开发者提供了一个编译和调试iOS代码的基础平台。首先,我们需要理解为什么在...

    xgboost 已编译 (64位windows下 用mingw64 在 cygwin环境下编译)

    **XGBoost简介** ...通过以上步骤,你应该能够在64位Windows环境下,使用Mingw64在Cygwin环境中成功编译XGBoost。编译完成后,你可以将生成的库文件用于你的项目,享受XGBoost带来的高效机器学习体验。

    squashfs-toos源码,可以在window上cygwin环境下进行编译,生成exe文件;测试可以正常使用

    在Windows环境下,通过Cygwin来编译和使用Squashfs-tools是可行的。Cygwin是一个提供Linux环境的开源工具集合,允许用户在Windows上运行许多原生的Linux命令和工具,包括GCC编译器,这使得在Windows上构建原本为...

    cygwin windows下编译

    通过Cygwin,开发者可以在Windows环境下使用类似于Linux的shell,例如Bash,以及常见的开发工具,如GCC(GNU Compiler Collection)进行编译,GDB(GNU Debugger)进行调试,还有make等构建工具。这些工具使得开发者...

    cygwin环境编译与调试

    Cygwin 是 Windows 上类似于 Linux 的环境。它包括一个提供 UNIX 功能性基本子集的 DLL 以及在这之上的一组工具

    ns leach cygwin环境搭建

    Cygwin则是一个在Windows平台上模拟Linux环境的软件,它提供了一个类UNIX的命令行接口和开发工具,使得可以在Windows上运行像NS-2这样的通常在Linux环境下运行的程序。 标题“ns leach cygwin环境搭建”表明,这个...

    Cygwin (Windows下的UNIX环境)

    Windows下的UNIX环境Cygwin 一、简介 Cygwin是一个在windows平台上运行的unix模拟环境,是cygnus solutions公司开发的自由软件(现已被Redhat收购)。Cygwin是一个全功能的Win32应用,它是UNIX应用的一个Porting层...

    cygwin 下 rsync-3.0.8安装及使用说明

    在本教程中,我们将深入探讨如何在Cygwin环境下安装rsync 3.0.8版本,并学习其基本用法。 首先,我们需要获取`rsync-3.0.8`的安装包。这个过程可以通过访问rsync官方网站或使用Cygwin的包管理器`setup.exe`来完成。...

    ncl6.4_cygwin

    总的来说,"ncl6.4_cygwin"是NCL6.4在32位Cygwin环境下的实现,为Windows用户提供了在类UNIX环境中运行NCL的可能性,从而能够方便地处理和可视化科学数据。通过熟悉NCL的语法和函数,科学家和工程师们可以在Windows...

    cygwin下的arm交叉编译工具链

    cygwin下的arm交叉编译工具链,cygwin下的arm交叉编译工具链

    cygwin之root权限

    Cygwin是一个在Windows平台上模拟类Unix环境的强大工具,它提供了大量的GNU和开源工具,使得开发人员可以在Windows上像在Linux环境下那样进行开发工作。然而,在某些情况下,用户可能需要在Cygwin环境中以root权限...

    hbase-0.94脚本hbase在cygwin的环境的bug

    其次,可以尝试在Cygwin环境下使用其他开源工具来辅助调试,如strace或gdb。最后,不要忘记查阅官方文档和社区论坛,这些资源通常包含了已知问题的解决方案。 总之,尽管在Cygwin下运行HBase 0.94版本可能会遇到...

    iPhone在CYGWIN下开发介绍

    【iPhone在CYGWIN下开发】是指在Windows操作系统上通过CYGWIN这个开源软件来模拟Linux环境,从而进行iPhone应用程序的开发。CYGWIN是一种在Windows上提供类UNIX环境的工具,它允许开发者在Windows系统中运行许多原本...

Global site tag (gtag.js) - Google Analytics