`
jeyechao
  • 浏览: 49104 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

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

阅读更多

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代码。

 

LOCAL_BUILD_SCRIPT := BUILD_EXECUTABLE
LOCAL_MAKEFILE     := $(local-makefile)

$(call check-defined-LOCAL_MODULE,$(LOCAL_BUILD_SCRIPT))
$(call check-LOCAL_MODULE,$(LOCAL_MAKEFILE))
$(call check-LOCAL_MODULE_FILENAME)

# we are building target objects
my := TARGET_

$(call handle-module-filename,,)
$(call handle-module-built)

$(eval LOCAL_BUILT_MODULE := $(TARGET_OUT)/$(MY_LOCAL_MODULE_FILENAME))

LOCAL_MODULE_CLASS := EXECUTABLE
include $(BUILD_SYSTEM)/build-module.mk

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

 

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

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

 

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

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES := ...
LOCAL_MODULE := xxx
MY_LOCAL_MODULE_FILENAME := libxxx.so
LOCAL_C_INCLUDES := ...
LOCAL_LDLIBS:=-L$(SYSROOT)/usr/lib -llog
LOCAL_CFLAGS := -fPIC

include $(MY_BUILD_EXECUTABLE)

 OK, 大功告成!

 

 

分享到:
评论

相关推荐

    android JNI运行NDK编译成的可执行文件

    4. **加载和运行可执行文件**:在Android应用中,我们需要获取可执行文件的路径,这可能需要将可执行文件作为资产或资源打包到APK中。然后,通过JNI函数调用`system()`或`exec()`函数来运行可执行文件。注意,这种...

    Linux下用NDK和SDK工具将库文件打包进apk应用.pdf

    Linux下用NDK和SDK工具将库文件打包进apk应用.pdfLinux下用NDK和SDK工具将库文件打包进apk应用.pdf

    Android Studio打包.so库到apk中实例详解

    在Eclipse时代,使用NDK编译的.so库文件会被自动打包进apk。然而,随着Android Studio成为官方推荐的开发环境,这个过程有所改变。本文将详细介绍如何在Android Studio中将.so库打包进apk。 首先,你需要在Android ...

    Android ndk编译cpp代码后把执行文件推送到手机且授权执行的自动化脚本

    当我们ndk编译cpp之后需要手动执行ndk-build,把执行文件上传手机中,手机打开授予权限,执行文件等整个过程繁琐,可以通过脚本来一条龙完成,专注于代码的编写,不浪费编译和传送的时间。

    libunwind ndk编译配置文件

    4. **链接**:将生成的对象文件与所需的库链接,生成最终的可执行文件或库。 在NDK环境中,可以使用`ndk-build`命令来编译`Android.mk`文件,或者使用Android Studio的Gradle插件,通过`externalNativeBuild`配置来...

    NDK测试demo 编译c++ 文件

    在这个例子中,“TestNdkCpp”可能包含了C++源文件,这些文件需要被编译成可执行或可链接的目标。 为了编译C++代码,我们需要配置项目的`build.gradle`文件。在`android`块中添加`externalNativeBuild`部分,定义...

    live555 ndk 编译

    live555 库 和 testRtspClient.cpp 编译生成静态库 和 可执行文件 testRtspClient 编译方法: 首先进入各个模块执行 Makefile,将静态库拷贝至上层目录 执行 ndk-build

    android使用NDK编译curl库源码

    5. **执行NDK-BUILD**:在命令行中导航到含有`Android.mk`的目录,运行`ndk-build`命令。这将编译源码并生成.so库。 6. **集成到Android项目**:将生成的.so库文件复制到项目的`jniLibs`目录下,按照 ABI 分别放入...

    opus NDK 编译 Android.mk文件

    opus NDK 编译 Android.mk文件 仅供参考

    android-arm平台ndk交叉编译python

    7. **打包和部署**:将编译后的Python可执行文件和所有依赖库打包成Android可用的格式,例如APK或者库文件。然后,通过adb或其他方式将它们推送到Android设备上。 8. **测试**:在Android设备上运行编译好的Python...

    利用ndk编译android的sh文件

    利用ndk编译android的sh文件,利用该sh文件,能够正确编译出so文件

    编译so文件 Unity调用so文件样例

    4. **测试和运行**:将C#脚本挂载到场景中的游戏对象上,然后在Unity编辑器中预览或者导出APK在真机上测试,确保C++代码能够正确执行。 总结,制作和在Unity中调用SO文件的关键在于理解JNI接口的设计,正确配置C/...

    ndk编译opencv源码

    编译完成后,生成的库文件(.so)会自动打包到APK中。在Java或Kotlin代码中,你可以通过JNI接口调用这些本地方法。例如: ```java public class MainActivity extends AppCompatActivity { static { System....

    使用NDK编译Android第三库.so和.a 参考Github上的工程,仅 有OpenSSL为例pdf

    总结,使用NDK编译Android第三方库,如OpenSSL,涉及到一系列步骤,包括环境配置、源码获取、构建系统配置、编译选项设置、编译和链接、生成.so文件、集成到项目以及在Java代码中的使用。这个过程可能复杂且耗时,但...

    ndk 编译so库以及java调c、c调java

    总的来说,掌握NDK编译SO库和Java与C/C++交互是Android高级开发中的重要技能。这不仅能够优化性能,还能实现一些Java无法直接处理的任务,如图形处理、游戏引擎、机器学习库等。在实践中,开发者应熟练运用NDK提供的...

    Tess-two编译可用.so文件 2018

    5. **打包.so文件**:生成的.so文件需要被包含到Android应用的APK中,通常放在项目的`jniLibs`目录下,不同架构的文件放在相应的子目录中,如`armeabi-v7a`、`arm64-v8a`等。 6. **在Java代码中调用**:在Android...

    AS 运用NDK编译及调用

    6. **本地库链接**:编译原生代码会产生`.so`(Shared Object)动态链接库文件。在Android Studio的`CMakeLists.txt`或`Android.mk`文件中指定这些库,使其在运行时被加载。 7. **在Java中调用JNI**:在Java代码中...

    ubuntu下android ndk编译环境搭建详细描述

    2. 在项目的`build.gradle`文件中配置NDK路径和本地库编译设置。 3. 使用`./gradlew clean`和`./gradlew assembleDebug`命令编译项目,检查NDK是否成功集成。 4. 运行应用,确认C/C++代码能够正确执行。 五、高级...

    android studio中使用ndk编译.so文件,调用C/C++代码(jni编程)

    这些.so文件随后会被打包到APK中,供运行时使用。 在`NdkProject`这样的项目中,可能包含多个C/C++源文件,每个源文件可以单独定义JNI函数。CMakeLists.txt文件用于配置CMake构建系统,指示如何编译源文件并链接...

Global site tag (gtag.js) - Google Analytics