arm平台编译安卓应用
Ⅰ 标准C程序如何移植到android平台需要什么编译参数,我用的是arm-eabi-gcc工具链
首先 你编译的程序 用cat命令看 目录应该是/lib/libc.so.6 而Android 是 /system/lib/libc.so
本来已经有C库了 但是 我这里没有用~ 你可以在 你的PC安装机子上找到 交叉编译arm-eabi-gcc或 arm-linux-gcc安装目录下的arm/4.3.2/..../libc/lib/libc2.8.so好像 是这个 有一个是libc.so.6 这个是一个连接 不是文件 查看属性 看下连接的文件应该是 那个libc2.8.so (放心它是arm版的)拷贝这个文件到 安卓/system/lib/去 然后
用RE文件 为它添加一个 连接 /system/lib/libc.so.6 就可以了
这样 标准库是被移植去了 但是 你的应用程序 有可能使用的是 /lib/libc.so.6 不是 /system/lib/libc.so.6
先测试不行的话 就把 /system/lib 连接为/lib
Ⅱ 请教如何进行ARM Mali SDK编译Android OpenCL库
要编译到安卓平台下,我们替换9和10行内容,用安卓NDK中的arm-linux-androideabi编译器编译。所以修改platform.mk中的内容如下:
#CC:=arm-none-linux-gnueabi-g++
#AR=arm-none-linux-gnueabi-ar
CC:=arm-linux-androideabi-g++
AR=arm-linux-androideabi-ar
我也更新了,但是使用的时候提示“arm-none-linux-gnueabi-g++”命令找不到。
Ⅲ android ndk编译arm-linux平台可执行程序
既然是移植就不能再用原来的Android ndk进行编译了吧,不能图省事啊,要移植当然要换编译环境重新编译,Android ndk编译不出arm-linux程序的,要重新写Makefile也没办法呀,还是交叉编译吧。
Ⅳ 如何在arm上使用android
首先可以肯定回答在ARM上可以运行android,具体方法如下:
1、下载Android源码后,可以编译出crespo, maguro, tuna, panda 的image,也可以编译用于模拟器(generic)的image,
2、不能直接烧到tiny210上运行,可以基于generic进行移植,慢慢的跑起来再逐步完善
3、下载的内核源代码,配置并编译生成zImage即可。
Ⅳ android jni程序(c++)如何编译适用于arm-v8指令集的32位程序
可以看到Android上层的Application和ApplicationFramework都是使用java编写,
底层包括系统和使用众多的LIiraries都是C/C++编写的。
所以上层Java要调用底层的C/C++函数库必须通过Java的JNI来实现。
下面将学习Android是如何通过Jni来实现Java对C/C++函数的调用。以HelloWorld程序为例:
第一步:
使用Java编写HelloWorld 的Android应用程序:
package com.lucyfyr;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class HelloWorld extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.v("fresne", printJNI("I am HelloWorld Activity"));
}
static
{
//加载库文件
System.loadLibrary("HelloWorldJni");
}
//声明原生函数 参数为String类型 返回类型为String
private native String printJNI(String inputStr);
}
这一步我们可以使用eclipse来生成一个App;
因为eclipse会自动为我们编译此Java文件,后面要是用到。
第二步:
生成共享库的头文件:
进入到eclipse生成的Android Project中 :/HelloWorld/bin/classes/com/lucyfyr/
下:
可以看到里面后很多后缀为.class的文件,就是eclipse为我们自动编译好了的java文件,其中就有:
HelloWorld.class文件。
退回到classes一级目录:/HelloWorld/bin/classes/
执行如下命令:
javah com.lucyfyr.HelloWorld
生成文件:com_lucyfyr_HelloWorld.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_lucyfyr_HelloWorld */
#ifndef _Included_com_lucyfyr_HelloWorld
#define _Included_com_lucyfyr_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_lucyfyr_HelloWorld
* Method: printJNI
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_lucyfyr_HelloWorld_printJNI
(JNIEnv *, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif
可以看到自动生成对应的函数:Java_com_lucyfyr_HelloWorld_printJNI
Java_ + 包名(com.lucyfyr) + 类名(HelloWorld) + 接口名(printJNI):必须要按此JNI规范来操作;
java虚拟机就可以在com.simon.HelloWorld类调用printJNI接口的时候自动找到这个C实现的Native函数调用。
当然函数名太长,可以在.c文件中通过函数名映射表来实现简化。
第三步:
实现JNI原生函数源文件:
新建com_lucyfyr_HelloWorld.c文件:
#include <jni.h>
#define LOG_TAG "HelloWorld"
#include <utils/Log.h>
/* Native interface, it will be call in java code */
JNIEXPORT jstring JNICALL Java_com_lucyfyr_HelloWorld_printJNI(JNIEnv *env, jobject obj,jstring inputStr)
{
LOGI("fresne Hello World From libhelloworld.so!");
// 从 instring 字符串取得指向字符串 UTF 编码的指针
const char *str =
(const char *)(*env)->GetStringUTFChars( env,inputStr, JNI_FALSE );
LOGI("fresne--->%s",(const char *)str);
// 通知虚拟机本地代码不再需要通过 str 访问 Java 字符串。
(*env)->ReleaseStringUTFChars(env, inputStr, (const char *)str );
return (*env)->NewStringUTF(env, "Hello World! I am Native interface");
}
/* This function will be call when the library first be load.
* You can do some init in the libray. return which version jni it support.
*/
jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
void *venv;
LOGI("fresne----->JNI_OnLoad!");
if ((*vm)->GetEnv(vm, (void**)&venv, JNI_VERSION_1_4) != JNI_OK) {
LOGE("fresne--->ERROR: GetEnv failed");
return -1;
}
return JNI_VERSION_1_4;
}
OnLoadJava_com_lucyfyr_HelloWorld_printJNI
函数里面做一些log输出 注意JNI中的log输出的不同。
JNI_OnLoad函数JNI规范定义的,当共享库第一次被加载的时候会被回调,
这个函数里面可以进行一些初始化工作,比如注册函数映射表,缓存一些变量等,
最后返回当前环境所支持的JNI环境。本例只是简单的返回当前JNI环境。
http://www.cnblogs.com/bastard/archive/2012/05/19/2508913.html
