jni 와 ndk 의 사용목적 및 기타 게임 프로그램 전병우 이종민. engine...
Post on 27-Dec-2015
245 Views
Preview:
TRANSCRIPT
모바일 프로그래밍JNI 와 NDK 의 사용목적 및 기타 게임 프로그램
전병우이종민
목차
Engine Multi-Platform Engine 설명▪ Interface▪ Function
Game Game Concept Game Flow Game 기획
JNI & NDK Break Limitation of NDK JNI, NDK
Sound Sensor
Engine
Palm
Multi-Platform
Engine
Win-dows
Linux
Symbian
Mac
Palm
Multi-Platform
Engine
Win-dows
Linux
Symbian
Mac
Interface
Palm
Multi-Platform
Engine
Win-dows
Linux
Symbian
Mac
Interface
Function
Engine 설명
Interface
• 외부 노출• Platform De-
pendant
Function
• 외부 노출• Platform In-
dependent
Interface
Mark2Core
Mark2-Graphic
Mark2Ren-derSystem
Update
Render
Event
Main.cpp
Interface
Mark2Core
Mark2-Graphic
Mark2Ren-derSystem
Update
Render
Event
Main.cpp
Android
Windows
WindowsMobile
C++
C++
Activity.Java
Interface
Main.cpp
Android
Windows
WindowsMobile
Java
NDKOpenGL
ES
main
DirectX
OpenGL
WinMainDirectMo-
bileOpenGL ES
C++
C++
Activity.Java
Interface
Main.cpp
Android
Windows
WindowsMobile
Java
NDKOpenGL
ES
main
DirectX
OpenGL
WinMainDirectMo-
bileOpenGL ES
JNI, NDK
Interface
int APIENTRY WinMain(){
MApplication app(MApplication::RENDERSYSTEM_DIRECTMOBILEFIXED);
MWidget* pMainWidget = MNEW Galaxy3();app.exec();return 0;
}
int APIENTRY WinMain(){
MApplication app(MApplication::RENDERSYSTEM_DIRECTX9);MWidget* pMainWidget = MNEW Galaxy3();app.exec();return 0;
}
Interface
void init(const char* apkPath){ pApp = MNEW MApplication(MApplication::RENDERSYSTEM_OPENGLES); pMainWidget = MNEW Galaxy3;}
bool update(){ bool bRunning = true; pApp->FrameStart(); bRunning = pApp->FrameUpdate(); pApp->FrameEnd(); pApp->MessagePump(); return bRunning;}
Instance
Archieve
Load Picture
XML Parser
Fixed Point
Delegate
3D ObjectWrap Ren-
dererWidget Sys-tem
Function
Mark2Core
Mark2Ren-derSystem
Mark2-Graphic
Main.cpp
Message System
Sound
Function.Instance
Filename MObject*
Filename MObject*
Filename MObject*
std::map<String, MObject*>
이중 충돌
Function.Instance
First Use
Constructor
Reference++
Release
Reference--
Destroyer
Function.Achieve
Zip
Mesh
Sound
User Inter-face
Etc
http://www.nih.at/libzip/
Function.Load Picture
http://www.libpng.org/pub/png/libp-ng.html
http://www.ijg.org/
Raw ImageColorCon-
vert
RGB888
ARGB8888
RGBA8888
RGB565
Function.XMLParser
http://www.grinninglizard.com/tinyxml/
XMLFileXMLMeshLoader
XMLAnimationLoader
Function.FixedPoint
• Opengl ES 1.1• Direct MobileFixed Point
• Opengl ES 2.0• DirectX• Opengl
Floating Point
Function.Delegate
http://en.wikipedia.org/wiki/Signals_and_slots
http://en.wikipedia.org/wiki/Delegate_(.NET)
http://en.wikipedia.org/wiki/Observer_pattern
http://www.codeproject.com/KB/cpp/fd.aspxJaeWook Choi
Function.Sound
Win-dows
MobileAndroid
Win-dows
MediaManager
AudioManager
MSound Warpper
Function.3DObject
3ds MaxPlugin
3D ObjectXML
3D ObjectAnimation
XML
XMLParser
Mark2RenderSystem
Function.WarpRenderer
WarpRendererDi-
rectX DirectMobile
Fixed Float
Opengl Opengl ES
An-droid
Win-dows
Mobile
CreateTex-ture
CreateLight
CreateMate-
rialMessagePumpBegin
SceneEnd
Scene Present
Mark2-Graphic
Mark2RenderSystem
Function.WidgetSystem
Start Game
Credit
Exit Game
S P A C E R A I L
GameWindow
Title
Menu
StartGame
Credit
ExitGameBackgroundStar
Widget
2DWid-get
2DWid-get
2DWid-get
2DWid-get
2DWid-get
3DWid-get
Function.MessageSys-tem
GameWindow
Title
Menu
StartGame
Credit
ExitGameBackgroundStar
Start Game
Credit
Exit Game
S P A C E R A I L
Click~!
Message Pumping
CompareUI Rect &
ClickPosition
Function.MessageSys-tem
Win-dowsMes-sageProc
Win-dows
MobileMes-sageProc
Android ActivityEvent Call-Back
MessageSystemPush Event
Pop Event
WidgetSystem
Game
28세종대학교
An-droid
IOS
Win-dows
Mobile
Win-dows
Phone 7
Sym-bian
Palm
Game
세종대학교 29
An-droid
Win-dows
Phone 7
Sym-bian
Palm
Win-dows
Mobile
IOS
Game
Game Concept
남극탐험
스카이로드
Game Concept
카메라와 캐릭터를 고정시켜 조작감 극대화
Speed100 AU
Speed
100 AU
Game Flow
Play GameMy
RecordsOptions
Informa-tion
Exit
Space Rail
My Records 선택
Back 선택
My Records1. 2009/11/04 2000122. 2009/11/04 2000123. 2009/11/04 2000124. 2009/11/04 2000125. 2009/11/04 200012
Back
Back 선택
Information 선택
Back 선택Optio
n 선택
Exit 선택
Help
Option
Windows
Information
Credits
Back
Back
Credits
Back
Help
Back
Help 선
택Back
선택
Back 선택Credits 선택
How to Play?~~~~~~~````~~~~~~~~```~~~~~~~~```~~~~~~~~```
Back
선택
선택
Back 선택
Help~~~~~~~~~~~~~~~~~~````~~~~~~~~```~~~~~~~~```~~~~~~~~```
Game Flow
Play Game
My Records
Options
Informa-tion
Exit
Galaxy
Play Game 선택
Back 선택
행성 선택화면 선택
Back
조건 1)조건 2)조건 3)
Play
선택
선택Back
Back 선택
Play 선택
Back 선택
Back
Speed100 AU
Game 기획
시작점
End
분명한 Goal
현재위치무제한으로 점프 스킬을 사용할 수 있다 .
점프 스킬 사용
Game 기획
이동 동작
미사일 발사
파란미사일 발사체 생성
점프 불가
가스 분출구 봉쇄
점프 2 배
보조 날개 생성
공중 동작
가속
부스터 크기 최대
일반 이동
부스터 조금 발사
감속
부스터 방출 없음
Game 기획이동 속도
속도가 빨라질 수록 맵 내려오는 속도가 증가한다 .
이동 방향
기본적으로 한 칸씩 좌우 이동이 가능하다 .
Game 기획
속도 상승
속도 하강
무적 점프 2배
일반 이동 점프 불가 추락
미사일 발사
미사일 발사1 칸당 1 발
발사된 미사일과 NPC 충돌 시 사망
발사선 밟고 점프시 공중 발사
속도 상승상승 속도 = 최도 속도 * 2입장 시 급격한 상승 ( 정상
속도부터 )퇴장 시 급격한 하강 ( 정상 속도로 )
점프 2 배좌우로 2 칸 이동
정면으로 2 칸 이동
무적밟고 있는 동안 무적
일반 이동게임 시작 - 최고 속도 도달 2 초
좌우 점프 – 1 칸 이동정면 점프 - 1 칸 이동
속도 하강상승 속도 = 최도 속도 * (1/2)
입장 시 급격한 하강 ( 정상 속도부터 )
퇴장 시 급격한 상승 ( 정상 속도로 )
점프 불가점프 불가능 ( 통제 불가 )
추락시작 위치로 이동
Game 기획
좌우로 이동( 끝까지 이동 )
플레이어를 향해 돌진등장 시
좌로 3 칸 이동 후정리 우로 3 칸 M 을 그리며 점프 이동 미사일 발사
Enemy 1 Enemy 1 Enemy 3 Enemy 4 Enemy 5
이동 속도 이동 속도 이동 속도
좌 , 우 이동 칸 수
이동 후 정지 시간
이동 속도
점프 후 정지 시간
이동 속도
이동 후 정지 시간
Enemy 3 움직임+
미사일 발사 ( 턴 전 )
Game 기획
A Type( 고정 ) B-1f Type C-1f Type( 빠른 좌회전 ) D-1F Type
C-2f Type( 빠른 우회전 )
C-1s Type( 느린 좌회전 )B-1s Type
E-1F Type ( 빠른 좌회전 )
D-2f Type
D-1s Type
D-2s Type
E-1F Type ( 느린 좌회전 )
E-1F Type ( 빠른 우회전 )
E-1F Type ( 느린 우회전 )
- 1 - - 1 -
- 1 -
- 1 - - 1 - - 1 -- 1 - - 1 -
F - Type G - Type
C-2s Type( 느린 우회전 )
- 1 - - 1 -
JNI & NDK
JAVA C++Java Native Interface
C - DynamicLink
Native Development Kit
Cross-Compiler
JNI & NDK
Dalvik
Java Native Interface
JNI & NDK
Windows
Cygwin
Native Development Kit
Android.mk
Static Link
Android.mk Android.mk
Static LinkDynamic Link
Dynamic Link
Java Native Interface
JAVA
C Code
Software Development Kit
Break Limitation of NDK
NDK
libc
libm
libzLibegl
C++
Break Limitation of NDK
http://www.crystax.net/android/ndk-r4.php
CrystaX
C++ Excep-tion
RTTISTL
JNI, NDK
static {System.loadLibrary("Mark2Core");
System.loadLibrary("Mark2Graphic"); //System.loadLibrary("Mark2RenderSystem_GLES"); System.loadLibrary("Makkolli"); }
public native void nativeInit(String apkPath);public native void nativeUpdate();public native void nativeMousePush(int nX, int nY);public native void nativeMouseRelease(int nX, int nY);
C++ 로 만들어둔 Library 들 로드
Java C 로 통하는 함수 정의
JNI, NDKclass MakkolliRenderer implements GLSurfaceView.Renderer {
public void onSurfaceCreated(GL10 gl, EGLConfig config) {m_SpaceRailAct.nativeInit(apkFilePath);
}
public void onDrawFrame(GL10 gl) {m_SpaceRailAct.nativeUpdate();
}}class MakkolliGLview extends GLSurfaceView {
public boolean onTouchEvent(final MotionEvent event){switch( event.getAction() ){
case MotionEvent.ACTION_DOWN:m_SpaceRailAct.nativeMousePush((int)event.getX(), (int)event.getY());
break;case MotionEvent.ACTION_UP:
m_SpaceRailAct.nativeMouseRelease((int)event.getX(), (int)event.getY());break;
}return true;}
}
Java C 로의 실질적인 함수
호출
JNI, NDKJava C Inter-
face 에서 C 함수 정의 자동 생성
ndk-build 를 이용한 C 코드
컴파일
JNI, NDK
include $(CLEAR_VARS)
MARK2CORE = \Mark2Core.cpp \………..../jni_tools.cpp
LOCAL_C_INCLUDES := LOCAL_MODULE := Mark2CoreLOCAL_SRC_FILES := $(MARK2CORE)
LOCAL_CFLAGS := -DANDROID_NDK -DMARK2CORE_EXPORTSLOCAL_CPP_EXTENSION := .cppLOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -ldl -llog -lzLOCAL_STATIC_LIBRARIES := libjpeglib libpnglib libzlib libtinyxml libzipinclude $(BUILD_SHARED_LIBRARY)
Android.mk
JNI, NDK
/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>JNIEXPORT void JNICALL Java_makkolli_spacerail_SpaceRailActivity_nativeInit (JNIEnv *, jobject, jstring);JNIEXPORT void JNICALL Java_makkolli_spacerail_SpaceRailActivity_nativeUpdate (JNIEnv *, jobject);JNIEXPORT void JNICALL Java_makkolli_spacerail_SpaceRailActivity_nativeMousePush (JNIEnv *, jobject, jint, jint);JNIEXPORT void JNICALL Java_makkolli_spacerail_SpaceRailActivity_nativeMouseRelease (JNIEnv *, jobject, jint, jint);
자동으로 생성된 Java C Inter-
face 함수
JNI, NDK#include <jni.h>#include "Mark2Core/Mark2Core.h"#define CB_CLASS "makkolli/spacerail/SpaceRailActivity“#define CB_CLASS_MSG_CB "OnMessage"#define CB_CLASS_MSG_SIG "(Ljava/lang/String;I)V“#define CB_CLASS_PLAYSOUND_CB "OnPlaySound"#define CB_CLASS_PLAYSOUND_SIG "(Ljava/lang/String;)V“#define CB_CLASS_STOPSOUND_CB "OnStopSound"#define CB_CLASS_STOPSOUND_SIG "(Ljava/lang/String;)V“#define CB_CLASS_PLAYLOOPSOUND_CB "OnPlayLoopSound"#define CB_CLASS_PLAYLOOPSOUND_SIG "(Ljava/lang/String;)V“#define CB_CLASS_PLAYEFFECTSOUND_CB "OnPlayEffectSound"#define CB_CLASS_PLAYEFFECTSOUND_SIG "(Ljava/lang/String;)V“#define CB_CLASS_STOPEFFECTSOUND_CB "OnStopEffectSound"#define CB_CLASS_STOPEFFECTSOUND_SIG "(Ljava/lang/String;)V“void MARK2CORE_API jni_PlayEffectSound(const char* strMusicName);void MARK2CORE_API jni_StopEffectSound(const char* strMusicName);void MARK2CORE_API jni_PlaySound(const char* strMusicName);void MARK2CORE_API jni_PlayLoopSound(const char* strMusicName);void MARK2CORE_API jni_StopSound(const char* strMusicName);void MARK2CORE_API jni_OutputString(const char* strOutputString);void MARK2CORE_API jni_Init(JNIEnv *env);
C Java 함수 정의
JNI, NDK
void MARK2CORE_API jni_OutputString(const char* strOutputString){
JNIEnv *env; g_VM->AttachCurrentThread(&env, NULL); jclass jNativesCls; jNativesCls = env->FindClass(CB_CLASS);
jmethodID jni_Method;
if (! jni_Method ) {// Get aref to the static method:jni.Natives.OnMessage jni_Method = env->GetStaticMethodID(jNativesCls, CB_CLASS_MSG_CB,
CB_CLASS_MSG_SIG); }
if (jni_Method) {// Call method env->CallStaticVoidMethod(jNativesCls, jni_Method, env-
>NewStringUTF(strOutputString), (jint) 2 ); }
}
C JAVA 로의 실질적인 함수
호출
Sound
MediaMan-ager
StopSound
Java Native Interface
AudioMan-ager
PlaySound
PlayEffect
StopEffect
Event
Activity nativeReleaseJava Native Interface
nativePush
nativeAccelerome-ter
Sensor
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);mAccSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);mSensorManager.registerListener(this, mAccSensor, SensorManager.SENSOR_DELAY_GAME);
public void onSensorChanged(SensorEvent event) { Sensor sensor = event.sensor;if (sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
nativeAccelerometer(event.values[1], event.values[0], event.-values[2]);
}}
Q & A
top related