【转】如何把ndk编译出来的可执行文件伪装成so打包到apk中

原文网址:http://jeyechao.iteye.com/blog/2164286

ndk编译出来的共享库,eclipse会自动打包到apk中,而编译出来的可执行文件则不会。

要想可执行文件自动被打包到apk中,可以把文件名改成libxxx.so的形式,伪装成so,这样就会被打包进apk。

但是每次编译之后都改一下名字,太麻烦!

写个脚本吧,又有arm, armv7, x86的麻烦事!

想试着改LOCAL_MODULE_FILENAME来试试,NDK又不允许。

于是稍微看了下NDK的编译脚本,发现如下解决办法。

NDK是通过在Android.mk文件中include $(BUILD_EXECUTABLE)来编译可执行文件,其实就是调用了一个已经写好的脚本——build-executable.mk。(编译脚本都在NDK_ROOT/build/core目录里面)

仔细看脚本的调用过程可以发现,脚本一开始先检查一下变量合法性(前面改LOCAL_MODULE_FILENAME的方法在这里过不去),最终调用include$(BUILD_SYSTEM)/build-module.mk来编译。

于是研究这个脚本,找到决定编译输出的变量,在调用最终的编译脚本之前改成想要的就可以了。

最终我的方案如下:

1. 为了不破坏ndk本来的脚本,将build-executable.mk拷贝一份放在自己的工程目录下面,在倒数第三行插入一句 $(evalLOCAL_BUILT_MODULE := $(TARGET_OUT)/$(MY_LOCAL_MODULE_FILENAME))

2. 在自己的Android.mk文件中定义MY_LOCAL_MODULE_FILENAME变量,当然值就是你想要的文件名啦

3. 编译时不调用系统的include$(BUILD_EXECUTABLE), 而改调用自己的脚本(就是上面拷贝出来且做了修改的那个脚本),为了方便,你可以给自己的脚本定义一个变量来指向它。

就是这样。

写得比较乱,贴几段关键代码吧。

修改后的build-executable.mk代码。

Xml代码  

  1. LOCAL_BUILD_SCRIPT := BUILD_EXECUTABLE
  2. LOCAL_MAKEFILE     := $(local-makefile)
  3. $(call check-defined-LOCAL_MODULE,$(LOCAL_BUILD_SCRIPT))
  4. $(call check-LOCAL_MODULE,$(LOCAL_MAKEFILE))
  5. $(call check-LOCAL_MODULE_FILENAME)
  6. # we are building target objects
  7. my := TARGET_
  8. $(call handle-module-filename,,)
  9. $(call handle-module-built)
  10. $(eval LOCAL_BUILT_MODULE := $(TARGET_OUT)/$(MY_LOCAL_MODULE_FILENAME))
  11. LOCAL_MODULE_CLASS := EXECUTABLE
  12. include $(BUILD_SYSTEM)/build-module.mk

14行就是我们加的那一行。

上面的文件放在jni根目录,跟目录下的Android.mk代码:

Xml代码  

  1. MY_BUILD_EXECUTABLE := $(JNI_ROOT)/build-executable.mk
  2. include $(call all-subdir-makefiles)

需要编译可执行文件的模块这样写:

Xml代码  

  1. LOCAL_PATH := $(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_SRC_FILES := ...
  4. LOCAL_MODULE := xxx
  5. MY_LOCAL_MODULE_FILENAME := libxxx.so
  6. LOCAL_C_INCLUDES := ...
  7. LOCAL_LDLIBS:=-L$(SYSROOT)/usr/lib -llog
  8. LOCAL_CFLAGS := -fPIC
  9. include $(MY_BUILD_EXECUTABLE)

OK, 大功告成!

时间: 2024-10-28 10:44:55

【转】如何把ndk编译出来的可执行文件伪装成so打包到apk中的相关文章

NDK编译可执行文件在Android 中运行显示error: only position independent executables (PIE) are supported.失败问题解决办法。

由于使用了NDK编译的可执行文件在应用中调用,在Android 7.0上的运行情况发现,当运行该可执行文件时,报如下错误: error: only position independent executables (PIE) are supported. PIE这个安全机制从4.1引入,但是Android L之前的系统版本并不会去检验可执行文件是否基于PIE编译出的.因此不会报错.但是Android L已经开启验证,如果调用的可执行文件不是基于PIE方式编译的,则无法运行.解决办法非常简单,在A

【转】NDK编译可执行文件在Android L中运行显示error: only position independent executables (PIE) are supported.失败问题解决办法。

原文网址:http://blog.csdn.net/hxdanya/article/details/39371759 由于使用了NDK编译的可执行文件在应用中调用,在4.4及之前的版本上一直没出问题.最近由于要测试在Android L上的运行情况发现,当运行该可执行文件时,报如下错误: error: only position independent executables (PIE) are supported. PIE这个安全机制从4.1引入,但是Android L之前的系统版本并不会去检验

NDK编译FFMpeg[Linux]

最近在研究视频直播相关的技术,了解到了FFmpeg,就在网上查看如何将FFmpeg移植到Android中,查了几天,看的东西不少,就是没有一个可以完全移植成功的,最后通过产看各种资料,结合网上的资料,终于把FFmpeg给搞定了.在此记录一下. 整体构思: 在Centos7.5下搭建NDk编译环境,编译FFmpeg库,生成Android所需要的库文件,然后在Android中使用 准备工作: 1.在虚拟机中安装Centos系统 2.下载NDK linux 32 bithttp://dl.google

android NDK编译(导入).a文件和编译多个so文件(转)

源:android NDK编译(导入).a文件和编译多个so文件 一.编译一个静态库 libstatic_android.a LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := static_android LOCAL_SRC_FILES := libstatic_android.a include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MOD

Android NDK 编译加入so文件

在cocos2d-x中集成百度语音识别的时候,运行build_native.py会把libs/armeabi目录清空. 以下是解决办法,把so文件放在jni/prebuilt里面. 修改Android.mk文件,主要有两行include $(CLEAR_VARS) LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) #百度语音识别so LOCAL_MODULE := BDVoiceRecognitionClient_V1 LOCAL_SRC_FI

[原]如何用Android NDK编译FFmpeg

\我们知道在Ubuntu下直接编译FFmpeg是很简单的,主要是先执行./configure,接着执行make命令来编译,完了紧接着执行make install执行安装.那么如何使用Android的NDK编译出来可以在Android下面可以使用的FFmpeg动态链接库呢?写下这篇文章就是学习如何裁剪并且编译出来可以使用的动态库. 一.获取FFmpeg源码: 首先在编译之前,得获取一份FFmpeg的源码,如果你没有git并且也不打算使用,你可以去FFmpeg官网http://ffmpeg.org/

使用Android Studio自带的NDK编译JNI

/********************************************************************************** * 使用Android Studio自带的NDK编译JNI * 说明: * 省得自己另外去下载NDK,编译JNI,麻烦. * * 2017-4-30 深圳 龙华民治樟坑村 曾剑锋 ****************************************************************************

一个小玩具:NDK编译FFmpeg的例子

FFmpeg NDK编译 和最简单的APK 准备 硬件: 一台电脑,实验在Lenovo T430上 一个Android设备,实验在 三星S3/A7 编译环境: Ubuntu 14.04 (ant\java等命令必须支持) 工具包: NDK: https://dl.google.com/android/ndk/android-ndk32-r10b-linux-x86_64.tar.bz2 SDK:https://dl.google.com/android/adt/adt-bundle-linux-

[Android]Cygwin使用及NDK编译方法

在Windows XP, Cygwin, NDK SDK r5b下成功编译了ffmpeg,下面是完整的编译过程: 一.准备工作 2.下载Cygwin, 请猛击这里 3.下载Android SDK,请猛击这里,Android SDK的网页 4.下载Android NDK SDK r5b, 请猛击这里,NDK SDK的网页 5.下载ffmpeg,可以下载压缩包,也可以git一个snapshot 好了,有必要说明一下Android SDK和Android NDK SDK的区别: Android SDK