`
king_tt
  • 浏览: 2122153 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Linux环境下Android JNI程序的编译

 
阅读更多

尊重原创作者,转载请注明出处:

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 := optional

LOCAL_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。
分享到:
评论

相关推荐

    编译live555 android动态库(Android.mk)

    将live555源码编译成可供android-ndk使用的动态库 1、linux下新建jni, 将Android.mk、build....2、linux下编译live555, 在linux交叉编译环境已经配置好的情况下,直接在jni目录执行脚本build.sh即可生成live555.so库。

    android 使用jni调用c++

    android配置ndk,使用swig编译生成jni Java接口调用c++方法。这是成功的例子,前提是你要配置一下你的环境变量。如有疑问,可以去查看我的博客。有相关内容。

    mipsel-linux-android-4.9

    android-ndk-r12b\toolchains下的编译平台 android-ndk-r12b\toolchains\mips64el-linux-android-4.9 android-ndk-r12b\toolchains\mipsel-linux-android-4.9

    2023-06-16 Android Studio 使用CMakeList编译JNI ,源码

    2023-06-16 Android Studio 使用CMakeList编译JNI ,源码,直接build build apk直接一部编译成apk

    Android Ekho(余音)

    Ekho(余音)是一个把文字转换成声音的软件。它目前支持粤语、普通话(国语)、诏安客语、藏语、雅言(中国古代通用语)和韩语(试验中),英文则...支持Linux、Windows、Android(暂不支持4.0及以上Android版本)。

    从源码编译Android系统的Java类库和JNI动态库的方法

    主要介绍了从源码编译Android系统的Java类库和JNI动态库的方法,例子基于Linux系统环境下来讲,需要的朋友可以参考下

    android系统原理及开发要点详解

     Android初级开发者:在本书指引下阅读代码,搭建系统开发环境,对于Android应用程序的开发者,重点关注后3章的内容。  Android中、高级开发者:通过本书的引导,学习系统架构,关注开发要点,并尽量使用手机系统...

    ffmpeg的Android编译与调用示例

    本资源包含了从ffmpeg的编译(Android和linux)到Android上简单jni调用的功能,可以作为入门级的参考资料!

    Android底层开发技术实战详解--内核、移植和驱动.(电子工业.王振丽).part1

    2.3.4 实践演练——演示编译Android程序的两种方法 43 2.4 编译Android kernel 47 2.4.1 获取goldfish内核代码 47 2.4.2 获取msm内核代码 50 2.4.3 获取omap内核代码 50 2.4.4 编译Android...

    android 及 linux 驱动入门 视频教程7

    1.认识ubuntu.ogv 2.ubuntu实用技巧.ogv 3.IMX6q_android4.4.2源码编译.ogv 4.用git克隆github仓库到本地.ogv 5.NDK编译c生成.so文件.ogv 6.IMX6q开发板...在应用空间用c程序控制led.ogv 10.APP通过JNI控制led灯.ogv

    mips64el-linux-android-4.9

    android-ndk-r12b\toolchains下的编译平台 android-ndk-r12b\toolchains\mips64el-linux-android-4.9 android-ndk-r12b\toolchains\mipsel-linux-android-4.9

    《Android系统源代码情景分析》

    1.6 单独编译和打包Android应用程序模块 1.6.1 导入单独编译模块的mmm命令 1.6.2 单独编译Android应用程序模块 1.6.3 重新打包Android系统镜像文件 第2章 硬件抽象层 2.1 开发Android硬件驱动程序 ...

    android系统原理及开发要点详解_韩超_梁泉 4

     第5章“Android的Java虚拟机和Java环境”,这是介于本地和Java层之间的相关内容,主要介绍Android的Java虚拟机Dalvik的基本概念、Android Java程序的环境、JNI的使用方法,以及Java框架的启动流程等。  第6章...

    android 完全中文版 开发应用详解

    第3章 android的linux内核与驱动程序 44 3.1 linux核心与驱动 44 3.2 android专用驱动 45 3.2.1 ashmem 45 3.2.2 binder 45 3.2.3 logger 46 3.3 android使用的设备驱动 46 3.3.1 framebuffer显示驱动 46 3.3.2 ...

    android 及 linux 驱动入门 视频教程5

    1.认识ubuntu.ogv 2.ubuntu实用技巧.ogv 3.IMX6q_android4.4.2源码编译.ogv 4.用git克隆github仓库到本地.ogv 5.NDK编译c生成.so文件.ogv 6.IMX6q开发板...在应用空间用c程序控制led.ogv 10.APP通过JNI控制led灯.ogv

    Android系统源代码情景分析-罗升阳-源码

    1.6 单独编译和打包Android应用程序模块 1.6.1 导入单独编译模块的mmm命令 1.6.2 单独编译Android应用程序模块 1.6.3 重新打包Android系统镜像文件 第2章 硬件抽象层 2.1 开发Android硬件驱动程序 2.1.1 ...

    mp4v2库移植android

    本包实现了mp4v2库正常编译生成动态库libCameraShooting.so,前提是linux下需要配置好ndk环境,进入jni目录执行ndk-build即可正常生成动态库。本人有完好的ndk包,如果需要,请私信给我!

    android系统原理及开发要点详解_韩超_梁泉 1

     第5章“Android的Java虚拟机和Java环境”,这是介于本地和Java层之间的相关内容,主要介绍Android的Java虚拟机Dalvik的基本概念、Android Java程序的环境、JNI的使用方法,以及Java框架的启动流程等。  第6章...

    详解AndroidStudio JNI +Gradle3.0以上JNI爬坑之旅

    我们先将写好的C/C++代码编译成对应平台的动态库(windows是.dll文件,linux是.so文件)。 下面我们来举个栗子:使用AndroidStudio来实现JNI 3.要实现JNI先下载NDK,那么NDK又是什么呢?(面试宝典来了,赶紧掏出小...

Global site tag (gtag.js) - Google Analytics