



main.cpp
#include "SDL.h"
int main(int,char**){
return 0;
}

Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := main
SDL_PATH := ../SDL2
LOCAL_C_INCLUDES := $(LOCAL_PATH)/$(SDL_PATH)/include
# Add your application source files here...
LOCAL_SRC_FILES := main.cpp
LOCAL_SHARED_LIBRARIES := SDL2
LOCAL_LDLIBS := -lGLESv1_CM -lGLESv2 -lOpenSLES -llog -landroid
include $(BUILD_SHARED_LIBRARY)







cmake_minimum_required(VERSION 3.18.1)
project("androidsdlthread")
#SDL统一路径
set(sdl_path ${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})
#添加SDL头文件
include_directories(${CMAKE_SOURCE_DIR}/include/SDL)
#添加SDL库
add_library(sdl SHARED IMPORTED)
set_target_properties(sdl PROPERTIES IMPORTED_LOCATION ${sdl_path}/libSDL2.so)
add_library(sdl_shared SHARED IMPORTED)
set_target_properties(sdl_shared PROPERTIES IMPORTED_LOCATION ${sdl_path}/libc++_shared.so)
add_library(sdl_main SHARED IMPORTED)
set_target_properties(sdl_main PROPERTIES IMPORTED_LOCATION ${sdl_path}/libmain.so)
add_library(
androidsdlthread
SHARED
native-lib.cpp
${CMAKE_SOURCE_DIR}/logger.h)
find_library(
log-lib
log)
target_link_libraries( # Specifies the target library.
androidsdlthread
sdl
sdl_shared
sdl_main
-landroid
${log-lib})

SDL(Simple DirectMedia Layer)库提供了信号量(semaphore)的支持,用于实现线程间的同步和通信。信号量是一种计数器,用于控制对共享资源的访问,可以实现多线程之间的同步和互斥,确保线程安全和资源的正确访问。
public native void startSDLThread();
public native void postSDL();
public native void releaseSDL();
#include
#include
extern "C" {
#include
#include "logger.h"
SDL_sem *g_sem = NULL;
int g_task_exit = 0;
int task1(void *data);
int task2(void *data);
int number=0;
JNIEXPORT void JNICALL
Java_com_anniljing_androidsdlthread_MainActivity_startSDLThread(JNIEnv *env, jobject thiz) {
g_task_exit=0;
g_sem = SDL_CreateSemaphore(0);
SDL_CreateThread(task1, "task1", NULL);
SDL_CreateThread(task2, "task2", NULL);
}
JNIEXPORT void JNICALL
Java_com_anniljing_androidsdlthread_MainActivity_postSDL(JNIEnv *env, jobject thiz) {
if (g_sem) {
SDL_SemPost(g_sem);
}
}
JNIEXPORT void JNICALL
Java_com_anniljing_androidsdlthread_MainActivity_releaseSDL(JNIEnv *env, jobject thiz) {
g_task_exit = 1;
SDL_DestroySemaphore(g_sem);
g_sem = NULL;
}
int task1(void *data) {
while (!g_task_exit) {
if (g_sem) {
LOGD("task1 SemWait");
SDL_SemWait(g_sem);
number++;
LOGD("task1 number:%d\n",number);
}
}
return 0;
}
int task2(void *data) {
while (!g_task_exit) {
if (g_sem) {
LOGD("task2 SemWait");
SDL_SemWait(g_sem);
number++;
LOGD("task2 number:%d\n",number);
}
}
return 0;
}
}


我们需要把这个文件夹拷贝到自己的项目

