Linux环境下Android JNI程序的编译
来源:互联网 发布:muji爽肤水 知乎 编辑:程序博客网 时间:2024/05/17 18:16
尊重原创作者,转载请注明出处:
http://blog.csdn.net/gemmem/article/details/8993493
在android开发中,有时候需要编写一些C/C++代码,这时候就要用到JNI技术,我们需要将C/C++程序首先编译成so库,在java中通过native方法调用so库中的函数。有一种简单的方法就是首先单独编译so库文件,将它push到手机的system/lib目录下, 在java程序中通过loadLibrary加载so库。但是这样做比较麻烦而且不符合应用程序发布的要求。
我们希望只通过一条mm命令,so文件就能够打包到apk文件中,随着apk一起发布,而不是将so文件放到系统目录中。
首先需要在app根目录下创建一个目录,比如叫做jni
进入jni目录,在里面新建C/C++文件以及.h文件,然后编写Android.mk文件,这个Android.mk文件的作用就是将C/C++编译为so文件,如下:
LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optional# This is the target being built.LOCAL_MODULE:= libmallocjni # All of the source files that we will compile.LOCAL_SRC_FILES:= \ com_example_demo_TestMemory.cpp# All of the shared libraries we link against.LOCAL_SHARED_LIBRARIES := \libutils libc# No static libraries.# Also need the JNI headers.LOCAL_C_INCLUDES += \$(JNI_H_INCLUDE)# No special compiler flags.LOCAL_CFLAGS +=include $(BUILD_SHARED_LIBRARY) //指定编译为so文件
再看看apk根目录的Android.mk怎么写:
LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optionalLOCAL_SRC_FILES := \ $(call all-java-files-under, src)LOCAL_PACKAGE_NAME := MyDemo //apk的名字LOCAL_PROGUARD_ENABLED := disabled //不进行代码混淆LOCAL_JNI_SHARED_LIBRARIES := libmallocjni //这个很关键,它指定需要加载的so文件LOCAL_STATIC_JAVA_LIBRARIES := common-net \ //指定jar别名include $(BUILD_PACKAGE)include $(CLEAR_VARS)LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \common-net:libs/commons-net-1.2.2.jar \ //指定jar文件的实际路径include $(BUILD_MULTI_PREBUILT)include $(call all-makefiles-under,$(LOCAL_PATH)) //编译jni/Android.mk完成了上面2个mk文件后,我们只需要在apk根目录执行mm编译Android.mk,jni/Android.mk就会执行,而且生成的so文件会自动打包到apk文件中。
其实这种编译方式会有一些问题,因为android在不断升级,版本多,这个so不能适应多个版本,容易发生native crash,所以在编译so库时最好采用ndk方式,即进入jni目录,执行ndk-build,这样生成的so兼容性比较好,再将这个so放到apk的中间文件目录中(out/target/product/crespo/obj/lib),再去执行项目根目录的android.mk。
- Linux环境下Android JNI程序的编译
- Android程序Linux环境下的编译步骤
- Android源码环境下编译自带JNI的APP
- Linux环境下的程序编译
- MAC环境下Android Studio的第一个JNI程序
- Linux下Android编译环境的搭建
- Linux下Android编译环境的搭建
- Linux下Android编译环境的搭建
- Linux下Android编译环境的搭建
- Android NDK&&JNI 编译环境的搭建
- Android NDK&&JNI 编译环境的搭建
- Eclipse环境下通过Cygwin使用NDK编译jni程序
- android 源码下的JNI编译
- TBitmap resize在 android编译环境下 JNI调用方式出错的解决方法!!!
- Linux环境下编译运行程序
- Linux环境下程序编译过程详解
- 在linux环境下编译C++ 程序
- linux环境下编译C++ 程序
- Python学习之client and server篇一:python 实现简单client与server
- Csico 清除接口上的 统计数据 #clear counters
- 指针常量和常量指针
- Ubuntu12.04+hadoop-1.1.2运行wordcount示例
- PHP输入流php://input
- Linux环境下Android JNI程序的编译
- 5种基本的图表展现
- WPF-18:输入验证的详细用法
- ArcGIS Server 开发系列(一)--编程框架总览
- 视频基本术语
- XXTEA加解密as3和python分别实现
- HDU1571:下沙小面的(1)
- 前端nginx +后端apache+php
- asp.net 返回上一页的实现方法小集(转)(http://www.cnblogs.com/liping19851014/archive/2007/07/14/818173.html)