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, 大功告成!
相关推荐
4. **加载和运行可执行文件**:在Android应用中,我们需要获取可执行文件的路径,这可能需要将可执行文件作为资产或资源打包到APK中。然后,通过JNI函数调用`system()`或`exec()`函数来运行可执行文件。注意,这种...
Linux下用NDK和SDK工具将库文件打包进apk应用.pdfLinux下用NDK和SDK工具将库文件打包进apk应用.pdf
在Eclipse时代,使用NDK编译的.so库文件会被自动打包进apk。然而,随着Android Studio成为官方推荐的开发环境,这个过程有所改变。本文将详细介绍如何在Android Studio中将.so库打包进apk。 首先,你需要在Android ...
4. **链接**:将生成的对象文件与所需的库链接,生成最终的可执行文件或库。 在NDK环境中,可以使用`ndk-build`命令来编译`Android.mk`文件,或者使用Android Studio的Gradle插件,通过`externalNativeBuild`配置来...
opus NDK 编译 Android.mk文件 仅供参考
当我们ndk编译cpp之后需要手动执行ndk-build,把执行文件上传手机中,手机打开授予权限,执行文件等整个过程繁琐,可以通过脚本来一条龙完成,专注于代码的编写,不浪费编译和传送的时间。
下载ndk编译出so和可执行文件,放到android 真机运行。
在这个例子中,“TestNdkCpp”可能包含了C++源文件,这些文件需要被编译成可执行或可链接的目标。 为了编译C++代码,我们需要配置项目的`build.gradle`文件。在`android`块中添加`externalNativeBuild`部分,定义...
live555 库 和 testRtspClient.cpp 编译生成静态库 和 可执行文件 testRtspClient 编译方法: 首先进入各个模块执行 Makefile,将静态库拷贝至上层目录 执行 ndk-build
5. **执行NDK-BUILD**:在命令行中导航到含有`Android.mk`的目录,运行`ndk-build`命令。这将编译源码并生成.so库。 6. **集成到Android项目**:将生成的.so库文件复制到项目的`jniLibs`目录下,按照 ABI 分别放入...
4. **测试和运行**:将C#脚本挂载到场景中的游戏对象上,然后在Unity编辑器中预览或者导出APK在真机上测试,确保C++代码能够正确执行。 总结,制作和在Unity中调用SO文件的关键在于理解JNI接口的设计,正确配置C/...
7. **打包和部署**:将编译后的Python可执行文件和所有依赖库打包成Android可用的格式,例如APK或者库文件。然后,通过adb或其他方式将它们推送到Android设备上。 8. **测试**:在Android设备上运行编译好的Python...
利用ndk编译android的sh文件,利用该sh文件,能够正确编译出so文件
确保所有配置正确无误后,进入`jni`目录,并执行`sudo ndk-build`命令来编译so文件。成功后,可以在`libs`目录下找到生成的so文件。 #### 四、常见问题与解决方案 1. **找不到文件问题**:如遇到类似“LOCAL_SRC_...
编译完成后,生成的库文件(.so)会自动打包到APK中。在Java或Kotlin代码中,你可以通过JNI接口调用这些本地方法。例如: ```java public class MainActivity extends AppCompatActivity { static { System....
总结,使用NDK编译Android第三方库,如OpenSSL,涉及到一系列步骤,包括环境配置、源码获取、构建系统配置、编译选项设置、编译和链接、生成.so文件、集成到项目以及在Java代码中的使用。这个过程可能复杂且耗时,但...
4. **设置NDK编译**:使用Android Studio的命令行工具或直接在`build.gradle`文件中配置NDK编译。对于CMake,可以添加类似以下的配置: ``` externalNativeBuild { cmake { cppFlags "-std=c++11 -frtti -...
总的来说,掌握NDK编译SO库和Java与C/C++交互是Android高级开发中的重要技能。这不仅能够优化性能,还能实现一些Java无法直接处理的任务,如图形处理、游戏引擎、机器学习库等。在实践中,开发者应熟练运用NDK提供的...
5. **打包.so文件**:生成的.so文件需要被包含到Android应用的APK中,通常放在项目的`jniLibs`目录下,不同架构的文件放在相应的子目录中,如`armeabi-v7a`、`arm64-v8a`等。 6. **在Java代码中调用**:在Android...