编译参考文章

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可执行体的更多相关文章

  1. win10下通过编译源码方式在chrome中成功安装react-devtools开发工具插件

    win10下通过编译源码方式在chrome中成功安装react-devtools开发工具插件   1.去git上下载react-devtools文件到本地,https://github.com/fac ...

  2. linux下ndk编译命令行程序及配置

    1.在http://developer.android.com/tools/sdk/ndk/index.html下载Android-ndk-r8e-linux-x86.tar.bz2,解压后把andr ...

  3. Linux下NDK编译FFMPEG包含neon参数

    FFMPEG编译成Android库已经有很多案例了,编译优化neon的也很多,以下是我通过实践成功的案例,这里主要讲编译的配置文件,其他设置可结合Linux下使用NDK编译FFMPEG(libstag ...

  4. Win10 下Cmake编译配置 Opencv3.1 + Cuda7.5 + VS2013

    折腾了三天终于配置成功了,在此写下编译配置的全部步骤和遇到的很多坑. 整体介绍: OpenCV 中 CUDA 实现的函数还不是太多,使用前要在OpenCV的官网上确认以下你想要的功能是否已经实现,否则 ...

  5. win10下vs2015编译的程序如何运行在win7等系统(无需安装Redistributable)

    最近新写的程序要做beta测试,在做绿色版(免安装版)时遇到了问题,vs2015做的项目本以为像之前的vs版本一样把msvcrXXX.dll还有另外几个运行时库都放到exe旁边即可,然并卵...,在w ...

  6. win10下clodeblocks编译C语言乱码

    打开settings->compile,在other compiler options添加下面两行代码: -fexec-charset=GBK-finput-charset=UTF-8

  7. Linux内核笔记——进程管理之执行体

    内核版本:linux-2.6.11 在Linux中,有多种执行体(指令流.执行单位),它们是CPU调度和分配资源的基本单位,它们是内核态可见的,即内核态下,每一种执行体都有对应的唯一数据结构task_ ...

  8. Linux下使用NDK编译FFMPEG(libstagefright)

    这个月要负责一个项目,使用FFMPEG渲染视频,主要是Android端的,由于性能要求,要使用硬解码,但网上大多数教程都是没有libstagefright的,所以个人觉得,生成的so库文件也是没有开启 ...

  9. ffmpeg2.2在ubuntu下使用NDK编译——并在android工程下测试使用

    作者:wainiwann 出处:http://www.cnblogs.com/wainiwann/ 本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...

随机推荐

  1. [转]JS私有化的实现——稳妥构造函数

    所谓稳妥对象, 指的是没有公共属性, 而且其方法也不引用this的对象.稳妥对象函数遵循与寄生构造函数类似的模式, 但有两点不同: 一是新创建对象的实例方法不引用this: 二是不使用new操作符调用 ...

  2. python编程os、os.path 模块中关于文件、目录常用的函数使用方法

    os模块中关于文件/目录常用的函数使用方法   函数名 使用方法 getcwd() 返回当前工作目录 chdir(path) 改变工作目录 listdir(path='.') 列举指定目录中的文件名( ...

  3. sql随机数

    ) as P_jsnews_id ) as P_jsnews_id) * from P_jsnews order by newid()

  4. POJ 2987 Firing(最大流最小割の最大权闭合图)

    Description You’ve finally got mad at “the world’s most stupid” employees of yours and decided to do ...

  5. 20172332 实验一《Java开发环境的熟悉》实验报告

    20172332 2017-2018-2 <程序设计与数据结构>实验一报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 于欣月 学号:20172332 实验教师:王 ...

  6. Android开发 使用 adb logcat 显示 Android 日志

    作者 : 万境绝尘  转载请著名出处 eclipse 自带的 LogCat 工具太垃圾了, 开始用 adb logcat 在终端查看日志; 1. 解析 adb logcat 的帮助信息 在命令行中输入 ...

  7. Mysql 工作原理

    刚开始接触一个新的事物的时候,我觉得很有必要从其工作原理入手,弄清楚这个东西的来龙去脉,为接下来的继续深入学习做好铺垫,掌握好其原理有助于我们从整体上来把握这个东西,并且帮助我们在排错过程中理清思路. ...

  8. opencart

    1. Deleting english language, what happens?   Disable English tab , category and products     1) Fir ...

  9. Sparsity Invariant CNNs

    文章链接 Abstract 本文研究稀疏输入下的卷积神经网络,并将其应用于稀疏的激光扫描数据的深度信息完成实验.首先,我们表明,即使当丢失数据的位置提供给网络时,传统卷积网络在应用于稀疏数据时性能也很 ...

  10. iOS开发本地通知

    /* 本地通知:不通过网络,在本地实现的通知,自己发给自己 远程通知:必须通过网络,使用推送技术(APNs),实现通知 本地通知: 1.要完成可以接收的通知形式的注册 2.具体通知的设置 3.发送通知 ...