尊重原创作者,转载请注明出处:
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。
分享到:
相关推荐
总结起来,在Android的JNI环境中获取MAC地址涉及以下几个关键知识点: 1. 使用JNI进行Java与C/C++交互。 2. 编写C/C++代码以执行原生操作。 3. 了解Android系统的权限管理,特别是在Android 6.0及更高版本中。 4. ...
通过这个简单的JNI示例,我们可以看到在Windows环境下,如何利用Android SDK和NDK进行本地代码的开发。理解并熟练运用JNI,不仅可以提升Android应用的性能,还能帮助开发者充分利用现有C/C++库,为复杂功能的实现...
本篇文章将详细解释如何在Windows环境下配置JNI编译环境。 首先,我们需要准备以下组件: 1. Java Development Kit (JDK):Java编程的基础,提供编译Java源码和运行Java应用所需的工具。 2. Android Native ...
本文将详细介绍如何在Linux环境下搭建一套简洁高效的Android Eclipse JNI (NDK) 开发环境。 #### 二、准备工作 在开始之前,我们需要确保具备以下条件: 1. **Linux操作系统**:本文基于Linux环境进行介绍,其他...
- 将.so库打包到Android应用的jniLibs目录下。 - 在Android应用运行时加载库,通过Java代码调用JNI函数控制LED。 6. **注意事项**: - 不同Android设备的硬件接口可能不同,因此驱动程序可能需要针对具体设备...
9. **总结**:这个教程资料“Android--JNI-Device.zip”对于希望深入了解Android硬件驱动开发的开发者来说非常有价值,它将帮助开发者学习如何利用JNI高效地与设备驱动进行交互,提高应用程序的性能和功能。
JNI是一种标准的Java平台接口,它允许Java代码与其他语言(如C、C++)编写的本地代码进行交互,这对于Android开发尤为重要,因为Android运行环境基于Java,但其底层系统是基于Linux的,这意味着开发者可以利用JNI来...
本文将深入探讨如何在Android环境中,利用JNI(Java Native Interface)技术实现串口通信。 首先,我们了解JNI的含义。JNI是Java平台提供的一种接口,允许Java代码和其他语言写的代码进行交互。在Android系统中,...
这个"简单易懂基于Android的JNI例子程序.rar"压缩包提供了一个基础的示例,帮助初学者理解如何在Android应用中使用JNI来调用本地(C/C++)代码。以下是关于JNI在Android开发中的相关知识点的详细解释: 1. **JNI...
JNI在很多场景下都非常有用,比如利用C++的高性能处理图像、音频或者进行复杂的数学运算,以及接入原生库。本教程将详细介绍如何在Android项目中使用JNI调用C++代码。 首先,你需要配置Android的NDK(Native ...
在Android系统中,JNI扮演着非常重要的角色,因为它使得Java应用程序能够与底层Linux操作系统进行通信,进而访问和控制硬件以及执行性能要求较高的操作。 在Android系统中,Java的应用层和框架层主要使用Java语言...
在Android系统中,APP(应用程序)与硬件交互通常通过JNI(Java Native Interface)和HAL(Hardware Abstraction Layer)层来实现。随着Android13的发布,这个交互过程得到了进一步优化和增强,使得APP能更高效、...
在Linux环境下编译FFmpeg并集成到Android项目中,通常会借助于Android NDK(Native Development Kit),这是一个让开发者用C/C++编写Android应用原生代码的工具集。 本文将详细介绍如何在Linux系统下使用NDK编译...
Android下的JNI(Java Native Interface)是一种允许Java代码与其他语言(如C、C++)交互的技术。JNI是Java 2 SDK的一部分,它提供了在Java程序中调用本地(非Java)代码的能力。当Java标准库无法满足特定需求,如...
`jni_md.h`则是特定平台的本地数据类型和函数定义,它根据目标平台(如Windows、Linux、Android等)的不同而有所不同。通常,`jni_md.h`被`jni.h`包含,并且在编译时由JDK自动选择合适的版本。 Java调用C和C++函数...
本主题涉及的是在Linux环境下,针对Android系统实现韦根(Wiegand)协议的驱动程序和JNI(Java Native Interface)代码,这对于智能家居、安防系统等需要与物理世界交互的应用尤其重要。 韦根协议是一种常见的非...
将live555源码编译成可供android-ndk使用的动态库 1、linux下新建jni, 将Android.mk、build....2、linux下编译live555, 在linux交叉编译环境已经配置好的情况下,直接在jni目录执行脚本build.sh即可生成live555.so库。
总之,"Android 串口JNI代码"是指使用JNI技术在Android平台上实现串口通信功能,允许应用程序与外部硬件设备进行数据交换。通过创建本地方法并在C/C++层面处理串口操作,开发者可以绕过Android SDK的限制,实现更...