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。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值