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

如上面所说

ndk编译出来的共享库,eclipse会自动打包到apk中,而编译出来的可执行文件则不会。 要想可执行文件自动被打包到apk中,可以把文件名改成libxxx.so的形式,伪装成so,这样就会被打包进apk。 但是每次编译之后都改一下名字,太麻烦, 写个脚本吧,又有arm, arm

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)。
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-03-31
  ndk编译出来的共享库,eclipse会自动打包到apk中,而编译出来的可执行文件则不会。 要想可执行文件自动被打包到apk中,可以把文件名改成libxxx.so的形式,伪装成so,这样就会被打包进apk。 但是每次编译之后都改一下名字,太麻烦! 写个脚本吧,又有arm, arm

  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, 大功告成!
  转载本回答被提问者和网友采纳
so怎样打包到apk里面
要将.so文件打包到APK中,可以按照以下步骤操作:确保NDK配置正确:首先,确保你的Android Studio环境已经正确配置了NDK(Native Development Kit)。NDK是Android官方提供的用于开发本地应用的工具集,它包含了编译C\/C++代码所需的编译器和工具。创建JNI层:在你的Android项目中的

如何把ndk编译出来的可执行文件伪装成so打包到apk中
1. 为了不破坏ndk本来的脚本,将build-executable.mk拷贝一份放在自己的工程目录下面,在倒数第三行插入一句?$(evalLOCAL_BUILT_MODULE := $(TARGET_OUT)\/$(MY_LOCAL_MODULE_FILENAME))2. 在自己的Android.mk文件中定义MY_LOCAL_MODULE_FILENAME变量,当然值就是你想要的文件名啦 3. 编译时不调用...

怎么把so打包打包进apk
1 是在Android.mk文件里增加 LOCAL_JNI_SHARED_LIBRARIES := libxxx 这样在编译的时候,NDK自动会把这个libxxx打包进apk;放在youapk\/lib\/目录下。2 是在应用的目录下手工建 libs\/armeabi 目录,然后把libxxx.so拷贝到这个目录下,这样NDK就会自动把这个libxxx.so打包进apk,位置还是在 放在youapk\/...

android studio ndk-build 编译C生成.so文件(ndk基础篇),看完你就懂...
1. 准备工作首先,确保你的开发环境已安装Android Studio 2.3版本,并配置了必要的SDK、JDK。通过SDK Manager安装所需的组件,完成后,为项目NdkDemo创建一个新的工程。2. ndk-build编译步骤在gradle.properties文件中添加android.useDeprecatedNdk=true,以便支持旧版NDK。编写Java类JNIUtils.java,然后重...

android开发,怎么使用ndk编译成.so文件
使用NDK编译成.so文件的步骤如下:下载并解压NDK:从Android NDK官方网站下载最新版本的NDK。将下载的压缩包解压到一个指定目录,例如D:ndk。配置编译环境:打开命令行窗口。使用cd命令进入NDK的samples目录,例如D:ndksampleshellojni。执行D:ndkndkbuild.cmd命令进行编译。编译生成.so文件:如果编译过程没...

如何在Android Studio中导入JNI生成的.so库
由于在原来的ADT的Eclipse环境中,用ndk_build工具生成了相应的各个.so库文件之后,eclipse工具就会自动把这些库导入到apk中。而Android Studio目前为止(0.86版本)还无法做到那么自动,但是我们可以通过以下方式进行。首先在Android Studio工程的app目录下创建整个jni目录,jni目录里写Android.mk、Application....

android studio ndk-build 编译C生成.so文件(ndk基础篇),看完你就懂...
查找.so文件:编译完成后,.so库文件会在指定的NDK输出目录下生成。将生成的.so文件复制到项目中的libs文件夹中,并确保它们按照不同的体系结构进行分类存放。集成.so库到项目:将.so文件添加到项目的libs目录中。在app module的build.gradle文件中进行配置,指定.so文件的路径和需要包含的体系结构。注意...

怎么修改apk预置so库
准备SO库文件:确保你有所需的SO库文件,这些文件通常位于APK的lib目录下,根据CPU架构的不同(如armeabi-v7a、arm64-v8a等),会有不同的SO库文件。将SO库放置到系统目录:如果需要将SO库预置到Android系统中,可以使用adb命令将其推送到设备的\/system\/vendor\/lib目录下(或其他适当的系统目录)。例...

android ndk 怎样调用第三方的so库文件
1.将SO文件直接放到libs\/armeabi下,然后代码中System.loadLibrary("xxx");再public native static int xxx_xxx_xxx();接下来就可以直接调用xxx_xxx_xxx()方法;2.第二种方案,创建自己的SO文件,在自己的SO文件里调用第三方SO,再在程序中调用自己的SO,这种比较复杂,需要建java类文件,生成.h...

Linux下NDK编译出的SO库能在WIndows下的android工程直接使用么_百度知 ...
1.android的NDK开发需要在linux下进行: 因为需要把C\/C++编写的代码生成能在arm上运行的.so文件,这就需要用到交叉编译环境,而交叉编译需要在linux系统下才能完成。2.安装android-ndk开发包,这个开发包可以在google android 官网下载: 通过这个开发包的工具才能将android jni 的C\/C++的代码编译成库 3...

相似回答