环境配置之类的我之前的博客有写,这篇文章我们就直接开始
1.在有ndk配置的服务器创建文件夹,文件夹再创建jni文件夹,jni文件夹里面放置Application.mk,Android.mk与test.c,因为我的ndk运行配置默认是项目下面的jni目录,所以我需要多一个jni目录

2.这里的Application.mk写的是架构属性,你们可以根据你们自己的环境设置
- # Application.mk
-
- # 指定要构建的目标 ABI
- APP_ABI := armeabi-v7a
- #用来指定应用程序所针对的最低 Android 平台版本的变量。
- #在使用 NDK 编译应用程序时,通常需要指定应用程序所需的最低 Android 平台版本,这样可以确保应用程序在#特定的 Android 版本上能够正确运行。APP_PLATFORM 变量允许你指定这个目标平台版本。
- APP_PLATFORM := android-28
3.再看下 Android.mk的配置,这里我注释了一下LOCAL_C_INCLUDES,这是.h的导入,这里我们就不做那么复杂了!
- LOCAL_PATH := $(call my-dir)
-
- include $(CLEAR_VARS)
-
- #这里只是个示例,导入头文件内容
- #LOCAL_C_INCLUDES := $(LOCAL_PATH)/include \
- # $(LOCAL_PATH)/cjson
-
-
-
- LOCAL_SRC_FILES := test.c
- LOCAL_MODULE := test
-
- #LOCAL_CFLAGS 是一个用来指定 C/C++ 编译器选项的变量。-fPIE 和 -fPIC 是两个常见的编译选项,它们#分别表示生成可执行文件和共享库时需要使用位置无关代码(Position Independent Code)和位置无关数
- #据(Position Independent Code)。
- #-fPIE 用于生成可执行文件,它告诉编译器生成位置无关可执行文件,这对于提高安全性和兼容性是很重要
- #的,特别是在现代的操作系统中,比如 Android 上的应用需要支持地址空间布局随机化(ASLR)。
- #-fPIC 用于生成共享库(动态链接库),它告诉编译器生成位置无关代码,以便在运行时动态加载并与其他库#链接,这也是确保库能够在不同地址空间加载时正常工作的关键。
-
- LOCAL_CFLAGS += -fPIE -fPIC
- # 添加 -pie 链接选项
- LOCAL_LDFLAGS += -pie
-
- # 合并所有库路径到一个 LOCAL_LDLIBS 变量中
- #LOCAL_LDLIBS := -L$(LOCAL_PATH)/libs \
- # -llog
- #因为这里我使用了一个log打印,这个log打印是能在android studio上看到的log
- LOCAL_LDLIBS := -llog
-
- #打包成可执行文件
- #include $(BUILD_EXECUTABLE)
- #打包成库 跟可执行文件只能二选一
- include $(BUILD_SHARED_LIBRARY)
4.编写jni的C代码,这里很多人应该已经知道我写的是什么了,这跟android studio默认生成的基本一模一样.com_example_myndkapplication_MainActivity是我的包名+类名组合的
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #define TAG "TAG" // 指定您的日志标签
-
- JNIEXPORT jstring JNICALL
- Java_com_example_myndkapplication_MainActivity_stringFromJNI(JNIEnv *env, jobject obj) {
-
-
- __android_log_print(ANDROID_LOG_DEBUG, TAG, "test_begain\r\n: %s", "===========stringFromJNI=======1======");
-
- __android_log_print(ANDROID_LOG_DEBUG, TAG, "test_end\r\n: %s", "===========stringFromJNI=======2======");
-
- return (*env)->NewStringUTF(env, "===========stringFromJNI=======3======");
- }

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

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




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

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