###SDL,JNI

sdlActivity是官方提供的类吗?

SDLActivity 并不是官方提供的类,而是在使用 SDL(Simple DirectMedia Layer)库进行 Android 开发时通常会遇到的一个类。

SDL 是一个跨平台的多媒体开发库,可以用于开发音视频播放器、游戏等应用。在 Android 平台上,SDL 提供了一个名为 SDLActivity 的类,用于简化 SDL 应用的初始化和运行过程。

SDLActivity 类位于 SDL_android_main.c 文件中,通过 JNI(Java Native Interface)与 Java 层进行交互。它提供了一些常用的函数和方法,包括:

  1. onCreate():在应用程序启动时被调用,用于初始化 SDL 和相关资源。

  2. onPause()onResume():在应用程序切换到后台或前台时被调用,用于暂停和恢复应用程序的运行。

  3. onNativeResize():在窗口大小变化时被调用,用于处理窗口大小的调整。

  4. onNativeKeyDown()onNativeKeyUp():在按键事件发生时被调用,用于处理键盘事件。

  5. onNativeTouch():在触摸事件发生时被调用,用于处理触摸事件。

SDLActivity 类的存在使得在 Android 平台上使用 SDL 开发应用更加方便,开发者可以集中精力在业务逻辑的实现上,而不必过多关注底层的初始化和事件处理等细节


为什么只有共享库,没有看到c代码呢?jni,Java怎么就调用c了?

在 SDL 中,通过 JNI 实现 Java 层与本地代码(C/C++)的通信是一个关键的机制,让我们来看一下具体的步骤:

  1. 在 Java 代码中声明本地方法

    • 在 Java 代码中使用 native 关键字声明需要调用的本地方法。这样 JVM 在运行时会去加载对应的本地库并执行其中的函数。
    • 生成头文件

      使用 javac 命令结合 -h 选项生成 JNI 的头文件。这个头文件会包含 JNI 方法的声明,用于在 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 实现与本地代码交互,执行相应的功能

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值