环境配置之类的我之前的博客有写,这篇文章我们就直接开始
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 <jni.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
#include <unistd.h>
#include <sys/time.h>
#include <android/log.h>
#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了