sdlActivity是官方提供的类吗?
SDLActivity
并不是官方提供的类,而是在使用 SDL(Simple DirectMedia Layer)库进行 Android 开发时通常会遇到的一个类。
SDL 是一个跨平台的多媒体开发库,可以用于开发音视频播放器、游戏等应用。在 Android 平台上,SDL 提供了一个名为 SDLActivity
的类,用于简化 SDL 应用的初始化和运行过程。
SDLActivity
类位于 SDL_android_main.c
文件中,通过 JNI(Java Native Interface)与 Java 层进行交互。它提供了一些常用的函数和方法,包括:
-
onCreate()
:在应用程序启动时被调用,用于初始化 SDL 和相关资源。 -
onPause()
和onResume()
:在应用程序切换到后台或前台时被调用,用于暂停和恢复应用程序的运行。 -
onNativeResize()
:在窗口大小变化时被调用,用于处理窗口大小的调整。 -
onNativeKeyDown()
和onNativeKeyUp()
:在按键事件发生时被调用,用于处理键盘事件。 -
onNativeTouch()
:在触摸事件发生时被调用,用于处理触摸事件。
SDLActivity
类的存在使得在 Android 平台上使用 SDL 开发应用更加方便,开发者可以集中精力在业务逻辑的实现上,而不必过多关注底层的初始化和事件处理等细节
为什么只有共享库,没有看到c代码呢?jni,Java怎么就调用c了?
在 SDL 中,通过 JNI 实现 Java 层与本地代码(C/C++)的通信是一个关键的机制,让我们来看一下具体的步骤:
-
在 Java 代码中声明本地方法:
- 在 Java 代码中使用
native
关键字声明需要调用的本地方法。这样 JVM 在运行时会去加载对应的本地库并执行其中的函数。 -
生成头文件:
使用javac
命令结合-h
选项生成 JNI 的头文件。这个头文件会包含 JNI 方法的声明,用于在 Java 层调用本地方法。
- 在 Java 代码中使用
3.定义本地方法:
首先,在 C/C++ 文件中实现需要被 Java 调用的方法,并使用 JNIEXPORT 定义这些方法为 JNI 方法。例如,可以在 SDL_android_main.c 文件中定义与 SDLActivity 相关的 JNI 方法。其实就是包含头文件后,实现头文件中声明的方法。
#include <jni.h>
JNIEXPORT void JNICALL Java_org_example_SDLActivity_nativeMethod(JNIEnv* env, jobject obj) {
// 在这里实现需要被 Java 调用的本地方法逻辑
// 可以在这里编写与 SDLActivity 相关的功能实现
}
4.生成共享库
将 C/C++ 代码编译成共享库(.so 文件),供 Java 虚拟机加载
5.加载本地库
在 Java 代码中使用 System.loadLibrary("library_name")
加载生成的共享库
6.调用本地方法
在 Java 代码中通过声明的 native 方法名进行调用,JVM 会通过 JNI 实现与本地代码交互,执行相应的功能