• linux+ndk把jni制作成so库供apk使用(基础)


    环境配置之类的我之前的博客有写,这篇文章我们就直接开始

    1.在有ndk配置的服务器创建文件夹,文件夹再创建jni文件夹,jni文件夹里面放置Application.mk,Android.mk与test.c,因为我的ndk运行配置默认是项目下面的jni目录,所以我需要多一个jni目录

     

    2.这里的Application.mk写的是架构属性,你们可以根据你们自己的环境设置

    1. # Application.mk
    2. # 指定要构建的目标 ABI
    3. APP_ABI := armeabi-v7a
    4. #用来指定应用程序所针对的最低 Android 平台版本的变量。
    5. #在使用 NDK 编译应用程序时,通常需要指定应用程序所需的最低 Android 平台版本,这样可以确保应用程序在#特定的 Android 版本上能够正确运行。APP_PLATFORM 变量允许你指定这个目标平台版本。
    6. APP_PLATFORM := android-28

    3.再看下 Android.mk的配置,这里我注释了一下LOCAL_C_INCLUDES,这是.h的导入,这里我们就不做那么复杂了!

    1. LOCAL_PATH := $(call my-dir)
    2. include $(CLEAR_VARS)
    3. #这里只是个示例,导入头文件内容
    4. #LOCAL_C_INCLUDES := $(LOCAL_PATH)/include \
    5. # $(LOCAL_PATH)/cjson
    6. LOCAL_SRC_FILES := test.c
    7. LOCAL_MODULE := test
    8. #LOCAL_CFLAGS 是一个用来指定 C/C++ 编译器选项的变量。-fPIE 和 -fPIC 是两个常见的编译选项,它们#分别表示生成可执行文件和共享库时需要使用位置无关代码(Position Independent Code)和位置无关数
    9. #据(Position Independent Code)。
    10. #-fPIE 用于生成可执行文件,它告诉编译器生成位置无关可执行文件,这对于提高安全性和兼容性是很重要
    11. #的,特别是在现代的操作系统中,比如 Android 上的应用需要支持地址空间布局随机化(ASLR)。
    12. #-fPIC 用于生成共享库(动态链接库),它告诉编译器生成位置无关代码,以便在运行时动态加载并与其他库#链接,这也是确保库能够在不同地址空间加载时正常工作的关键。
    13. LOCAL_CFLAGS += -fPIE -fPIC
    14. # 添加 -pie 链接选项
    15. LOCAL_LDFLAGS += -pie
    16. # 合并所有库路径到一个 LOCAL_LDLIBS 变量中
    17. #LOCAL_LDLIBS := -L$(LOCAL_PATH)/libs \
    18. # -llog
    19. #因为这里我使用了一个log打印,这个log打印是能在android studio上看到的log
    20. LOCAL_LDLIBS := -llog
    21. #打包成可执行文件
    22. #include $(BUILD_EXECUTABLE)
    23. #打包成库 跟可执行文件只能二选一
    24. include $(BUILD_SHARED_LIBRARY)

     4.编写jni的C代码,这里很多人应该已经知道我写的是什么了,这跟android studio默认生成的基本一模一样.com_example_myndkapplication_MainActivity是我的包名+类名组合的

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #define TAG "TAG" // 指定您的日志标签
    10. JNIEXPORT jstring JNICALL
    11. Java_com_example_myndkapplication_MainActivity_stringFromJNI(JNIEnv *env, jobject obj) {
    12. __android_log_print(ANDROID_LOG_DEBUG, TAG, "test_begain\r\n: %s", "===========stringFromJNI=======1======");
    13. __android_log_print(ANDROID_LOG_DEBUG, TAG, "test_end\r\n: %s", "===========stringFromJNI=======2======");
    14. return (*env)->NewStringUTF(env, "===========stringFromJNI=======3======");
    15. }

     

    5.直接进入jni目录开始编译,直接ndk-build,这里我是报错了,没找到编译目录,然后我再次设置了一遍编译目录:export NDK_PROJECT_PATH=/your/project/path

     然后再次执行ndk-build,然后我们就能在application的目录看到libs

    这时候我们就能把这个库文件给安卓使用了:

     运行就能看到我们在jni里面打印的log了

  • 相关阅读:
    YOLO-World:实时开放词汇目标检测
    visual studio2019怎么修改字体
    经典卷积神经网络 - LeNet
    QT5 实现 SFTP 上传和下载文件
    商业楼智能照明解决方案,配套产品有哪些
    PCIE1—快速实现PCIE接口上下位机通信(一)
    二叉树刷题(完结篇)
    使用Excel批量生成SQL语句,用过的人都说好
    【云原生】云原生与DevOps的结合:提升软件开发与交付的效率
    C++【STL】【vector类的模拟实现】【迭代器失效问题】
  • 原文地址:https://blog.csdn.net/qq_36333309/article/details/138185040