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/ 本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...
随机推荐
- Windows运行机理——API与SDK
Windows运行机理这系列文章都是来至于<零基础学Qt4编程>——吴迪,个人觉得写得很好,所以搬运加以整理. 首先 API:Application Programmaing Interf ...
- 爬虫——URL模块爬取糗事百科段子
最简单的爬取网页找有用信息,难点应该是正则锁定有用信息部分,看了一些其他大神的正则,最后还是决定按照自己理解写一个,果然我头脑相对简单,写出来的粗糙而易理解,也完成了自己想要的需求,就这样了~ # - ...
- [JSON].typeOf( keyPath )
语法:[JSON].typeOf( keyPath ) 返回:[String | Number | Boolean | Json | Array | Function | 空字符] 说明:获取指定键 ...
- 垃圾收集器与内存分配策略(深入理解Java虚拟机)
3.1 概述 垃圾收集器要解决哪些问题? 哪些内存需要回收 什么时候回收 如何回收 引用计数算法:当有一个地方引用,+1,引用失效,-1. 缺点:对象之间相互循环引用的问题. 可达性分析算法: ...
- matlab 常用集合相关的函数
Matlab常用的集合相关的函数如下: union(A,B) %求集合A和集合B的并集 intersect(A,B) %求集合A和集合 ...
- [leetcode-744-Find Smallest Letter Greater Than Target]
Given a list of sorted characters letters containing only lowercase letters, and given a target lett ...
- 20145214 《Java程序设计》第9周学习总结
20145214 <Java程序设计>第9周学习总结 教材学习内容总结 JDBC简介 JDBC全名Java DataBase Connectivity,是java联机数据库的标准规范.它定 ...
- LintCode-140.快速幂
快速幂 计算an % b,其中a,b和n都是32位的整数. 样例 例如 231 % 3 = 2 例如 1001000 % 1000 = 0 挑战 O(logn) 标签 分治法 code class S ...
- OSG学习:转动的小汽车示例
由于只是简单的示例,所以小汽车的模型也比较简单,是由简单的几何体组成. 代码如下: #include <osg\ShapeDrawable> #include <osg\Animat ...
- 3dContactPointAnnotationTool开发日志(八)
今天上午去实验室打算把项目从github上pull下来发现貌似不行,然后强行pull下来后项目变得乱七八糟了,有的组件都不知道去哪里了.去github上看了看发现上面day6和day7都没有,特别 ...