android studio + libSDL2.so显示一张bmp图片
来源:互联网 发布:中建七局网络协同平台 编辑:程序博客网 时间:2024/05/29 02:19
目标:一个简单的app程序,基于SDL开源库,实现加载一张bmp图片,并且显示的功能。
环境要求:
1. 一个可用的android studio开发环境;本次用的是android studio 2.3.0 ;
2.SDL源码,下载地址 SDL官网下载;
3.编译好的libSDL2.so动态库; 可以参考前面的文章《 linux下交叉编译android版本的libSDL2.so》;
4.Demo程序下载地址: https://github.com/zhuxian2009/MySDLDemo
第一步:创建一个支持C++的android工程;
注意一,将packet设为
org.libsdl.app因为SDL开源库中的android样例,也是用这个packet,这样会省去很多麻烦。
注意二,讲MainActive改为SDLActive,原因是SDL样例用的是SDLActive,可以为你的第一个Demo省去很多麻烦。老司机可以无视...
其他都是默认。
第二步:将编译好的libSDL2.so和头文件,放入指定位置;
2.1 将armeabi-v7a\libSDL2.so,放入app\libs
2.2 从SDL开源代码中提取头文件,提取SDL2\include;全部放入放入app\src\main\cpp\include;
2.3 将SDL2\src\dynapi;放入app\src\main\cpp\include;
2.4 将SDL2\src\目录最外层的所有文件放入sdlmain,放入app\src\main\cpp\include
第三步:将SDL开源工程中的SDL_android_main.c文件,放入app\src\main\cpp\
第四步:修改native-lib.cpp,实现调用SDL接口,加载图片,显示图片的功能:
#include <jni.h>#include <string>#include "SDL.h"extern "C"JNIEXPORT jstring JNICALLJava_org_libsdl_app_MainActivity_stringFromJNI( JNIEnv *env, jobject /* this */) { std::string hello = "Hello from C++"; return env->NewStringUTF(hello.c_str());}struct SBMPInfo{ SDL_Texture* texture; Uint16 w; Uint16 h;} ;/* Adapted from SDL's testspriteminimal.c */SBMPInfo LoadBMP(const char* file, SDL_Renderer* renderer){ SBMPInfo result; result.texture = NULL; result.w = 0; result.h = 0; SDL_Surface* temp; /* Load the sprite image */ temp = SDL_LoadBMP(file); if (temp == NULL) { fprintf(stderr, "Couldn't load %s: %s\n", file, SDL_GetError()); return result; } result.w = temp->w; result.h = temp->h; /* Create texture from the image */ result.texture = SDL_CreateTextureFromSurface(renderer, temp); if (!result.texture) { fprintf(stderr, "Couldn't create texture: %s\n", SDL_GetError()); SDL_FreeSurface(temp); return result; } SDL_FreeSurface(temp); return result;}void draw(SDL_Window* window, SDL_Renderer* renderer, const SBMPInfo tagBMP){ int w, h; SDL_GetWindowSize(window, &w, &h); SDL_Rect destRect = {w/2 - tagBMP.w/2, h/2 - tagBMP.h/2, tagBMP.w, tagBMP.h}; /* Blit the sprite onto the screen */ SDL_RenderCopy(renderer, tagBMP.texture, NULL, &destRect);}int main(int argc, char *argv[]){ SDL_Window *window; SDL_Renderer *renderer; if(SDL_CreateWindowAndRenderer(0, 0, 0, &window, &renderer) < 0) exit(2); SBMPInfo tagBMP = LoadBMP("logo.bmp", renderer); if(tagBMP.texture == NULL) exit(2); /* Main render loop */ Uint8 done = 0; SDL_Event event; while(!done) { /* Check for events */ while(SDL_PollEvent(&event)) { if(event.type == SDL_QUIT || event.type == SDL_KEYDOWN || event.type == SDL_FINGERDOWN) { done = 1; } } /* Draw a gray background */ SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF); SDL_RenderClear(renderer); draw(window, renderer, tagBMP); /* Update the screen! */ SDL_RenderPresent(renderer); SDL_Delay(10); } exit(0);}
通过以上修改,发现很多接口是无法识别的,因为studio不知道去哪里找头文件。
第五步:修改CMakeList.txt,指定头文件和库的加载
cmake_minimum_required(VERSION 3.4.1)set(lib_src_DIR ${CMAKE_SOURCE_DIR}/libs/armeabi-v7a)include_directories( ${CMAKE_SOURCE_DIR}/src/main/cpp/include)add_library(sdl2_lib SHARED IMPORTED)set_target_properties(sdl2_lib PROPERTIES IMPORTED_LOCATION ${lib_src_DIR}/libSDL2.so)#add_library(sdlmain_lib SHARED IMPORTED)#set_target_properties(sdlmain_lib PROPERTIES IMPORTED_LOCATION# ${lib_src_DIR}/libmain.so)add_library( native-lib SHARED src/main/cpp/native-lib.cpp src/main/cpp/SDL_android_main.c )find_library(log-lib log )find_library(GLESv1_CM-lib GLESv1_CM )find_library(GLESv2-lib GLESv2 )target_link_libraries( native-lib ${log-lib} ${GLESv1_CM-lib} ${GLESv2-lib} sdl2_lib # sdlmain_lib )
第六步:修改编译方式,CMAKE改为NDK方式
修改app下的build.gradle,将
externalNativeBuild { cmake { cppFlags "" } }改为
ndk { abiFilters 'armeabi-v7a' }
在android标签下,加入
sourceSets { main { jniLibs.srcDirs = ['libs'] } }
第七步:将SDL开源库中的SDLActive.java,替换掉studio自动生成的app\src\main\java\org\libsdl\app\SDLActive.java
第八步:将bmp图片copy到app\src\main\assets\logo.bmp;
rebuild-->run,结果如下:
- android studio + libSDL2.so显示一张bmp图片
- 在studio中使用libsdl2.so,编译SDL Demo
- linux下交叉编译android版本的libSDL2.so
- dls显示一张BMP位图。
- BMP图片显示程序
- Symbian:显示bmp图片
- emWin - BMP图片显示
- sdl2显示bmp图片
- MFC 显示bmp图片
- emWin - BMP图片显示
- SDL 显示bmp图片
- openg显示Bmp图片
- opencv显示一张图片
- opencv 显示一张图片
- opencv显示一张图片
- SDL显示一张图片
- OpenCv显示一张图片
- 1.显示一张图片
- 3-KYLIN订单例程
- 使用IDEA创建SpringBoot+neo4j项目
- 常见浏览器的兼容问题
- iOS多线程——GCD初级介绍
- Action class [*.*.*] not found
- android studio + libSDL2.so显示一张bmp图片
- java并发编程--Runnable Callable及Future
- echarts饼图实现多环形对比图
- 利用 Python 进行量化投资分析
- Mysql 插入记录时检查记录是否已经存在,存在则更新,不存在则插入记录SQL
- display two or more logcat filters at the same time in Android Studio
- 管中窥豹IIoT(一):工业物联网价值与解决方案通用模型
- LeetCode日常刷题(3)
- C语言中比较字符串大小