win10下ndk编译arm可执行体
编译参考文章
http://blog.csdn.net/john_1984/article/details/12622215
一、编写soLoader主文件
soLoader.c内容:
#include <stdio.h>
typedef int (*MAIN_FN)(int,char**);
int main(int argc,char* argv[]){
printf("hello so!\n");
int ret = dlopen("/data/local/xxx.so");
if (ret==)
{
printf("file not found!\n");
}
void* pfn = dlsym(ret,"main");
if (pfn==NULL)
{
printf("method \"main\" not found!\n");
}
((MAIN_FN)pfn)(argc,argv);
printf("result: %x\n",ret); }
二、编译o文件
E:\Documents\Android\sdk\ndk-bundle\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin>arm-linux-androideabi-gcc.exe --sysroot=E:\Documents\Android\sdk\ndk-bundle\platforms\android-\arch-arm -o E:\VMShare\Work\Andriod\antidebug\soLoader\jni\soLoader.o -c E:\VMShare\Work\Andriod\antidebug\soLoader\jni\soLoader.c
三、链接o文件为elf文件
E:\Documents\Android\sdk\ndk-bundle\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin>arm-linux-androideabi-gcc.exe --sysroot=E:\Documents\Android\sdk\ndk-bundle\platforms\android-\arch-arm -o E:\VMShare\Work\Andriod\antidebug\soLoader\jni\soLoader E:\VMShare\Work\Andriod\antidebug\soLoader\jni\soLoader.o
或者直接编译链接(二,三命令合并):
E:\Documents\Android\sdk\ndk-bundle\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin>arm-linux-androideabi-gcc.exe --sysroot=E:\Documents\Android\sdk\ndk-bundle\platforms\android-\arch-arm -o E:\VMShare\Work\Andriod\antidebug\soLoader\jni\soLoader E:\VMShare\Work\Andriod\antidebug\soLoader\jni\soLoader.c
四、push到手机,执行
//pc端命令
E:\VMShare\Work\Andriod\antidebug\soLoader\jni>adb push soLoader /data/local/tmp
//adb shell
shell@hammerhead:/data/local/tmp # chmod soLoader
shell@hammerhead:/data/local/tmp # ./soLoader
hello so!
file not found!
method "main" not found!
[] + Stopped (signal) ./soLoader
shell@hammerhead:/data/local/tmp # ls
===========第二种简单的利用Android.mk文件自动生成elf(eclipse的ndk自动插件)============
也可在Eclipse下创建android工程,Android Tools -> Add Native Support...,利用配置好的ndk环境编译链接生成elf文件。
参考文章
http://sodino.com/2015/01/12/dlopen-usage-demo/
为了方便编译生成so及binary,仍然在Eclipse+CDT+NDK环境中构建。
工程结构图如下:
comparison.c将编译生成待加载的动态链接库libComparison.so,其代码如下:
|
1
2
3
4
5
6
7
8
|
#ifndef _Comparison_c
#define _Comparison_c
int max (int a, int b) {
return a > b? a : b;
}
#endif
|
Execute.c将编译生成可在Android中直接运行的可执行文件。其代码如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
#include<stdio.h>
#include<dlfcn.h>
int main(void) {
// 必须写明绝对路径,否则找不着so文件呢
void *handle = dlopen("/data/local/libComparison.so",RTLD_LAZY);
int(*pfun)(int,int);
const char *error = NULL;
if(handle==NULL)
{
printf("error:dlopen libComparison.so Fail.\n");
return 1;
}
dlerror();
pfun = dlsym(handle,"max");
if((error=dlerror()) != NULL)
{
printf("error:dlsym method max fail.\n");
return 1;
}
printf("input tow number:\n");
int a, b;
scanf("%d%d", &a, &b);
int result = (*pfun)(a, b);
printf("Get:%d and %d, the max() return:%d\n",a, b, result);
dlclose(handle);
return 0;
}
|
Android.mk的作用在于声明配置并分别生成libComparison.so及Execute(binary)。其代码如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := Execute
LOCAL_SRC_FILES := Execute.c
#生成独立的可执行文件
include $(BUILD_EXECUTABLE)
include $(CLEAR_VARS)
LOCAL_MODULE := Comparison
LOCAL_SRC_FILES := comparison.c
#普通的so库
include $(BUILD_SHARED_LIBRARY)
|
右击工程 -> Build Project。则在libs下生成了libComparison.so及Execute(binary)。
使用ADB命令将这两个文件push到手机。并执行操作查看效果如下图:

==========第三种简单的利用Android.mk文件自动生成elf(eclipse手动添加jni环境)==========
手动添加好jni文件夹,配置好Android.mk和Application.mk后,手动切换ndk-build.cmd到工程的jni目录,编译执行(手动添加ndkbuilder的本质)
PS E:\Documents\workspace\CydiaModuleSo\jni> E:\Documents\Android\sdk\ndk-bundle\ndk-build.cmd
Android NDK: WARNING: APP_PLATFORM android- is higher than android:minSdkVersion in E:/Documents/workspace/CydiaModuleSo/AndroidManifest.xml. NDK binaries will *not* be comptible with devices older than android-. See https://android.googlesource.com/platform/ndk/+/master/docs/user/common_problems.md for more information.
Android NDK: WARNING:E:/Documents/workspace/CydiaModuleSo/jni/Android.mk:test.cy: non-system libraries in linker flags: -lsubstrate-dvm -lsubstrate
Android NDK: This is likely to result in incorrect builds. Try using LOCAL_STATIC_LIBRARIES
Android NDK: or LOCAL_SHARED_LIBRARIES instead to list the library dependencies of the
Android NDK: current module
[armeabi-v7a] Prebuilt : libsubstrate.so <= jni/
[armeabi-v7a] Install : libsubstrate.so => libs/armeabi-v7a/libsubstrate.so
[armeabi-v7a] Prebuilt : libsubstrate-dvm.so <= jni/
[armeabi-v7a] Install : libsubstrate-dvm.so => libs/armeabi-v7a/libsubstrate-dvm.so
[armeabi-v7a] Compile++ arm : test.cy <= test.cpp
In file included from E:/Documents/workspace/CydiaModuleSo/jni/test.cpp::
E:/Documents/workspace/CydiaModuleSo/jni/substrate.h::: warning: variadic templates are a C++ extension
[-Wc++-extensions]
template <typename Type_, typename Kind_, typename ...Args_>
^
E:/Documents/workspace/CydiaModuleSo/jni/test.cpp::: warning: format specifies type 'unsigned int' but the argument
has type 'void *' [-Wformat]
LOGD("dvm image: 0x%08X", (void* )image);
~~~~ ^~~~~~~~~~~~~
E:/Documents/workspace/CydiaModuleSo/jni/test.cpp::: note: expanded from macro 'LOGD'
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)
^~~~~~~~~~~
warnings generated.
[armeabi-v7a] StaticLibrary : libstdc++.a
[armeabi-v7a] SharedLibrary : libtest.cy.so
[armeabi-v7a] Install : libtest.cy.so => libs/armeabi-v7a/libtest.cy.so
win10下ndk编译arm可执行体的更多相关文章
- win10下通过编译源码方式在chrome中成功安装react-devtools开发工具插件
win10下通过编译源码方式在chrome中成功安装react-devtools开发工具插件 1.去git上下载react-devtools文件到本地,https://github.com/fac ...
- linux下ndk编译命令行程序及配置
1.在http://developer.android.com/tools/sdk/ndk/index.html下载Android-ndk-r8e-linux-x86.tar.bz2,解压后把andr ...
- Linux下NDK编译FFMPEG包含neon参数
FFMPEG编译成Android库已经有很多案例了,编译优化neon的也很多,以下是我通过实践成功的案例,这里主要讲编译的配置文件,其他设置可结合Linux下使用NDK编译FFMPEG(libstag ...
- Win10 下Cmake编译配置 Opencv3.1 + Cuda7.5 + VS2013
折腾了三天终于配置成功了,在此写下编译配置的全部步骤和遇到的很多坑. 整体介绍: OpenCV 中 CUDA 实现的函数还不是太多,使用前要在OpenCV的官网上确认以下你想要的功能是否已经实现,否则 ...
- win10下vs2015编译的程序如何运行在win7等系统(无需安装Redistributable)
最近新写的程序要做beta测试,在做绿色版(免安装版)时遇到了问题,vs2015做的项目本以为像之前的vs版本一样把msvcrXXX.dll还有另外几个运行时库都放到exe旁边即可,然并卵...,在w ...
- win10下clodeblocks编译C语言乱码
打开settings->compile,在other compiler options添加下面两行代码: -fexec-charset=GBK-finput-charset=UTF-8
- Linux内核笔记——进程管理之执行体
内核版本:linux-2.6.11 在Linux中,有多种执行体(指令流.执行单位),它们是CPU调度和分配资源的基本单位,它们是内核态可见的,即内核态下,每一种执行体都有对应的唯一数据结构task_ ...
- Linux下使用NDK编译FFMPEG(libstagefright)
这个月要负责一个项目,使用FFMPEG渲染视频,主要是Android端的,由于性能要求,要使用硬解码,但网上大多数教程都是没有libstagefright的,所以个人觉得,生成的so库文件也是没有开启 ...
- ffmpeg2.2在ubuntu下使用NDK编译——并在android工程下测试使用
作者:wainiwann 出处:http://www.cnblogs.com/wainiwann/ 本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...
随机推荐
- jmeter基础之录制篇
一.前言 jmeter如今被越来越多人喜爱的一款测试工具,相比于loadrunner它体积特轻便.jmeter不仅用来做单接口测试,压测还能做性能,主要是一款开源的,可以写一个你需要的插件功能再添加里 ...
- [JSON].getObj( keyPath )
语法:[JSON].getObj( keyPath ) 返回:[JSON] 说明:返回指定键名路径的JSON对象,指定键名路径不存在时返回空的toJson对象(强烈建议使用 [JSON].exists ...
- 【cookie接口】- jmeter - (请求提示no cookie)
1.虽然 请求成功 响应码 200 ,但是 返回code 1 ,表示接口不成功 2.加入 空的cookie 管理器就可以了 返回 code 0 注意:状态码 200 只是表示请求是成功的 , ...
- java基础-Comparator接口与Collections实现排序算法
java 排序Comparable和Comparator使用 java提供了两个排序用的接口Comparable和Comparator,一般情况下使用区别如下: Comparable 接口用于类的固定 ...
- SpringCloud IDEA 教学 (四) 断路器(Hystrix)
写在开始 在SpringCloud项目中,服务之间相互调用(RPC Remote Procedure Call —远程过程调用),处于调用链路底层的服务产生不可用情况时,请求会产生堆积使得服务器线程阻 ...
- 关于localStorage的实际应用
在客户端存储数据 HTML5 提供了两种在客户端存储数据的新方法: localStorage - 没有时间限制的数据存储 sessionStorage - 针对一个 session 的数据存储 之前, ...
- Python的实现分类
目前流行的Python实现包括CPython,Jython,IronPython,Stackless,PyPy,Cython,Shed Skin. CPython Cpython是Python的标准实 ...
- Saruman's Army(贪心)
Saruman the White must lead his army along a straight path from Isengard to Helm’s Deep. To keep tra ...
- c# byte[] 保存图片
1.用函数即可,File.WriteAllBytes(@"E:\123.bmp", pcBMPBuffer); 2.byte[]也可和image互相转化.
- c++SDK c#调用_疑难杂症
在编写过程中,会不时遇到各种问题: 1.dll明显在和exe同一目录下但调用不成功, 2.运行正常,没有报错,参数数值运行过程中也一致,但结果就是达不到预想, 都是dll没有引用完全造成的影响. 推荐 ...