zoukankan      html  css  js  c++  java
  • 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文件,如下:

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


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

    [plain] view plain copy
     
    1. LOCAL_PATH:= $(call my-dir)  
    2.   
    3. include $(CLEAR_VARS)  
    4.   
    5. LOCAL_MODULE_TAGS := optional  
    6.   
    7. LOCAL_SRC_FILES :=   
    8.         $(call all-java-files-under, src)  
    9.   
    10. LOCAL_PACKAGE_NAME := MyDemo //apk的名字  
    11.   
    12.   
    13. LOCAL_PROGUARD_ENABLED := disabled //不进行代码混淆  
    14.   
    15. LOCAL_JNI_SHARED_LIBRARIES := libmallocjni //这个很关键,它指定需要加载的so文件  
    16.   
    17. LOCAL_STATIC_JAVA_LIBRARIES := common-net  //指定jar别名  
    18.       
    19. include $(BUILD_PACKAGE)  
    20.   
    21. include $(CLEAR_VARS)  
    22.   
    23. LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES :=   
    24.                     common-net:libs/commons-net-1.2.2.jar   //指定jar文件的实际路径  
    25.   
    26. include $(BUILD_MULTI_PREBUILT)  
    27.   
    28. 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。

  • 相关阅读:
    国际区号选取组件
    python和js执行字符串函数
    mysql存储过程循环遍历某个表以及事件
    mysql创建远程用户
    ubuntu改文件夹权限
    mysql最大连接数
    MSYS
    Eclipse Java 可视化插件
    你不知道的继承
    vue3.x
  • 原文地址:https://www.cnblogs.com/luolizhi/p/5753819.html
Copyright © 2011-2022 走看看