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

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文件,如下:

  1. LOCAL_PATH:= $(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_MODULE_TAGS := optional
  4. # This is the target being built.
  5. LOCAL_MODULE:= libmallocjni
  6. # All of the source files that we will compile.
  7. LOCAL_SRC_FILES:= \
  8. com_example_demo_TestMemory.cpp
  9. # All of the shared libraries we link against.
  10. LOCAL_SHARED_LIBRARIES := \
  11. libutils libc
  12. # No static libraries.
  13. # Also need the JNI headers.
  14. LOCAL_C_INCLUDES += \
  15. $(JNI_H_INCLUDE)
  16. # No special compiler flags.
  17. LOCAL_CFLAGS +=
  18. include $(BUILD_SHARED_LIBRARY) //指定编译为so文件

再看看apk根目录的Android.mk怎么写:

  1. LOCAL_PATH:= $(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_MODULE_TAGS := optional
  4. LOCAL_SRC_FILES := \
  5. $(call all-java-files-under, src)
  6. LOCAL_PACKAGE_NAME := MyDemo //apk的名字
  7. LOCAL_PROGUARD_ENABLED := disabled //不进行代码混淆
  8. LOCAL_JNI_SHARED_LIBRARIES := libmallocjni //这个很关键,它指定需要加载的so文件
  9. LOCAL_STATIC_JAVA_LIBRARIES := common-net \ //指定jar别名
  10. include $(BUILD_PACKAGE)
  11. include $(CLEAR_VARS)
  12. LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \
  13. common-net:libs/commons-net-1.2.2.jar \  //指定jar文件的实际路径
  14. include $(BUILD_MULTI_PREBUILT)
  15. 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程序的编译的更多相关文章

  1. Linux环境下Android开发环境的搭建

    本文主要介绍在Ubuntu下Android开发环境的搭建,所使用的IDE为Eclipse(Android Studio同理,且可省去配置SDK以及安装adt插件的步骤). 1.安装JDK (1)JDK ...

  2. [学习笔记]Linux环境下部署 .Net5 程序

    ​公司的项目需要部署到一台公网的linux服务器,以便同事们测试小程序. 目标服务器是新搭建的CentOS 8虚拟机,以非docker的方式部署.现记录过程便于日后部署至项目甲方的服务器上,因为甲方的 ...

  3. 从零教你在Linux环境下(ubuntu)如何编译hadoop2.4

    问题导读: 1.如果获取hadoop src  maven包?2.编译hadoop需要装哪些软件?3.如何编译hadoop2.4?扩展:编译hadoop为何安装这些软件? 本文链接 http://ww ...

  4. windows和linux环境下java调用C++代码-JNI技术

    最近部门做安卓移动开发的需要调C++的代码,困难重重,最后任务交给了我,查找相关资料,没有一个教程能把不同环境(windows,linux)下怎么调用说明白的,自己在实现的过程中踩了几个坑,在这里总结 ...

  5. Linux环境下部署完JDK后运行一个简单的Java程序

    前言 前一篇文章详细讲解了如何在Windows环境下安装虚拟机+Linux系统,并且成功部署了JDK. 不过部署完JDK之后,我们判断部署是否成功的依据是看"java -version&qu ...

  6. linux(以ubuntu为例)下Android利用ant自动编译、修改配置文件、批量多渠道,打包生成apk文件

    原创,转载请注明:http://www.cnblogs.com/ycxyyzw/p/4555328.html  之前写过一篇<windows下Android利用ant自动编译.修改配置文件.批量 ...

  7. 针对 Linux 环境下 gdb 动态调试获取的局部变量地址与直接运行程序时不一致问题的解决方案

    基础的缓冲区溢出实践通常需要确定运行状态下程序中的某些局部变量的地址,如需要确定输入缓冲区的起始地址从而获得注入缓冲区中的机器指令的起始地址等.在 Linux 环境下,可通过 gdb 对程序进行动态调 ...

  8. 【ARM-Linux开发】Linux环境下使用eclipse开发C++动态链接库程序

    Linux环境下使用eclipse开发C++动态链接库程序 Linux中也有类似windows中DLL的变成方法,只不过名称不同而已.在Linux中,动态链接叫做Standard Object,生成的 ...

  9. Linux 环境下 C++ 的开发编译

    Linux环境下C++程序的开发编译学习笔记 环境:vmware 运行下的Ubuntu 16.04 姓名:谢津 时间:2018/5/24 内容:1)vim的安装及配置:2)第一个C++程序的编写与编译 ...

随机推荐

  1. 分享到QQ空间、新浪微博、腾讯微博和人人网

    function shareys(type, url, title, img, content) { switch (type) { case "sina": url = &quo ...

  2. NTFS 读写高手进阶 - Windows 格式硬盘 Mac存文件 开启 ...(转载)

    常识: 硬盘格式: FAT32 - WIndows 硬盘分区格式, 有点通用性高, 缺点不支持单个大于 4G 的文件. exFAT - Windows 硬盘分区格式, 兼容性低. 稳定性不如 FAT3 ...

  3. JIRA搭建

    请参考下面的文章 http://www.linuxidc.com/Linux/2014-09/106995.htm 所需下载的文件 链接: http://pan.baidu.com/s/1c0wad3 ...

  4. The Linux Storage Stack Diagram 内核 4.0 版的 I/O 栈

  5. php 创建文件

    $myfile = fopen("newfile.txt", "w") or die("Unable to open file!"); $t ...

  6. CSSHack 兼容性

    史上最全的CSS hack方式一览    CSS hack技巧大全    Can i use CSS hack CSS hack 由于不同厂商的流览器或某浏览器的不同版本(如IE6-IE11,Fire ...

  7. 计算机网络分层(OSI七层、 TCP/IP四层)

  8. 用shell获得hadoop中mapreduce任务运行结果的状态

    在近期的工作中,我需要用脚本来运行mapreduce,并且要判断运行的结果,根据结果来做下一步的动作. 开始我想到shell中获得上一条命令运行结果的方法,即判断"$?"的值 if ...

  9. 第六百二十六天 how cna I 坚持

    年代数竟然算错了,哎,好笨啊.2000年得有100代人了,好傻啊. 1到100,哎. 早上好像想通了呢,哎.又不打算去拉萨了. 到底..哎.睡觉.

  10. Linux自动修改IP脚本(手动编写)

    #!/bin/bashnetmask=255.255.255.0IP_PATH=/etc/sysconfig/network-scripts/ifcfg-eth0GM_PATH=/etc/syscon ...