생각해보면 환경 설정할때 안드로이드 API 버전을 지정하는곳이 없었다.
그래서 GLES 같이 특정버전이상 가능한 기능들은 에러가 나고 있다.

1.  Application.mk 을 연다.

2. 다음을 추가한다.
APP_PLATFORM := android-8

참고로 android-8은 2.2 프로요이다.
Posted by orange code
해결방법

1. C언어를 쓴다면 -> 직접 구현한다.

char* strlwr(char* s)
{
 // 셀프서비스



2. C++언어를 쓴다면 -> STL를 이용한다.

#include <string>
#include <cctype>
#include <algorithm>

std::string s = "~~~";
std::transform(s.begin(), s.end(), s.begin(), std::tolower); 


 
Posted by orange code
Android.mk 작성하기 간단

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# game -> libgame.so 가 생성된다.
LOCAL_MODULE := game
# game.cpp가 컴파일된다. 
LOCAL_SRC_FILES := game.cpp

# 현재 폴더의 모든 *.cpp를 추가하는 문장
ADD_SRC_FILES := $(wildcard $(LOCAL_PATH)/*.cpp)
ADD_SRC_FILES := $(ADD_SRC_FILES:$(LOCAL_PATH)/%=%)
LOCAL_SRC_FILES += $(ADD_SRC_FILES)

include $(BUILD_SHARED_LIBRARY)

 
Posted by orange code
1. cygwin 설치
- http://cygwin.org 에서 받아서 설치
- 시스템 환경변수 CYGWIN=nodosfilewaning 등록한다 
- 시스템 환경변수 PATH에 "cygwin설치경로\bin" 를 추가한다.. 예) c:\cygwin\bin

2. 기존 안드로이드 프로젝트 선택 후
 New -> Convert to C/C++ project 선택
 Makefile project는 Other Toolchain 선택

3. 프로젝트 -> C/C++ Build -> Builder settings
  Builder부분에서 체크 해제하고 make -f ${NDK-ROOT}/build/core/build-local.mk 타이핑
 Behaviour에서 Build옆에 all 삭제
 ** 필히 apply 클릭후에 ok **
 ** $(NDK-ROOT} 에는 본인PC의 ndk주소로 바꾼다 (/cygdrive/... 로 시작하는 형식으로) **


 4. 추가 사항
 C/C++ General -> Paths and Symbols.
 이곳에 include 패스를 지정해두면 헤더내용을 살펴볼 수 있다.
 실제 컴파일에 영향을 주진 않는다. 
Posted by orange code

private MediaPlayer mPlayer;


mPlayer = new MediaPlayer();

AssetFileDescriptor afd = DM.activity.getAssets().openFd(filename);

mPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());

mPlayer.prepare();
mPlayer.start(); 


주소가 assets/abc/def.mp3 라면
filename 에 abc/def.mp3 로 주면 된다..
 


실수1

mPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());

이 부분을

mPlayer.setDataSource(afd.getFileDescriptor()); 

이렇게 뒤에 파라미터 2개를 없애도 재생은 됐었는데
mp3가 여러개 되니까 엉뚱한 mp3를 재생했다..

 
Posted by orange code
Toast는 간단하게 메시지를 표시할 때 유용합니다.
또 Toast 대화창이 아니기 때문에 지정된 시간만큼 표시된 후에 자동으로 사라집니다.

Toast.makeText(this, "Hello!", Toast.LENGTH_SHORT).show();
길게 출력하고 싶다면 Toast.LENGTH_SHORT 대신 Toast.LENGTH_LONG을 쓰면 됩니다.



기본적으로 Toast는 화면 중앙 하단에 표시되는데 이 위치는 setGravity를 써서 바꿀 수 있습니다.

Toast t = Toast.makeText(this, "Hello!", Toast.LENGTH_SHORT);
t.setGravity(Gravity.LEFT | Gravity.TOP, 10, 10);
t.show();




Toast는 UI 쓰레드에서만 표시할 수가 있습니다. 따라서 UI쓰레드가 아닌 쓰레드에서 생성하고 싶을 경우에는 runOnUiThread 메소드를 이용하면 됩니다.

예) Activity 클래스이름이 MainActivity 일 경우

runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "Hello!", Toast.LENGTH_SHORT).show();
}
});





Posted by orange code
Android의 Activity는 설정이 바뀔 때 마다 재생성되게 된다.
경우에 따라 몇번이고 onCreate 가 연속으로 호출될 수 있다는 말이다.

화면 방향이 landscape 상태인 게임을 openGL을 사용하여 만들 경우 연속적인 openGL 초기화를 하려고 하여 문제가 생긴다.

이 때, manifest.xml 를 열어

<activity android:name=".MainActivity" android:label="@string/app_name">
이 부분에 다음과 같이 추가한다.

  <activity android:name=".MainActivity" android:label="@string/app_name" android:configChanges="orientation|keyboardHidden"> 

그러면 화면 방향이 바뀌는 경우에도 재생성이 일어나지 않아 문제가 발생하지 않는다.
Posted by orange code