JNI Basic for NDK - 2

일반적으로 NDK(JNI) 프로그램을 하려면 안드로이드 프로그램(Java)에서 네이티브 코드(C/C++)로 인자를 전달하고 그 결과를 리턴 값으로 받게 됩니다. 그러기 위해서는 두 언어 간의 데이터 형을 어떻게 매핑이 되는지를 알아야합니다. 앞으로 몇 장에 걸쳐서 자주 사용되는 데이터 형에 대하여 알아보도록 하겠습니다.

1. 간단한 네이티브 메써드

이번 장은 앞에서 사용한 Hello NDK and JNI 예제와 비슷한 예제로 시작을 하겠습니다. 이전에는 네이티브 메써드에서 문자열을 받아와 디스플레이를 했습니다. 이번에는 Java에서 단어를 전달하면 네이티브 메써드에서 그 단어에 다른 단어를 붙여서 리턴하는 예입니다.

Android Java 어플은 아래와 같이 작성했습니다.

public class JniStringActivity extends Activity {
private native String concatString(String what);

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
String retString = concatString("Apple");
tv.setText(retString);
setContentView(tv);
}

static {
System.loadLibrary("concatString");
}
}

이클립스에서 새 Android Project를 생성합니다. New Android Project 창에 아래와 같이 입력하고 Finish를 클릭합니다.

Project Name : JniString
Build Target : Android 2.2
Application name : JniString
Package name : ndk.jnistring

자동 생성된 JniStringActivity.java의 JniStringActivity class의 내용을 위의 코드와 같이 수정합니다.

이 클래스의 onCreate에서 concatString이라고하는 네이티브 메써드를 호출합니다. 인자로 'Apple'을 전달하면 네이티브 메써드에서 'Hell'를 붙여 'Hello Aplle'을 리턴합니다. System.loadLibray는 스태틱 초기화에서 실행이 되면서 concatString이라고 하는 라이브러리를 로드합니다.

네이티브 메써드인 concatString은 아래와 같은 원형으로 구현이 됩니다.

JNIEXPORT jstring JNICALL Java_ndk_jnistring_JniStringActivity_concatString
(JNIEnv *env, jobject obj, jstring what)

네이티브 메써드의 함수 원형은 javah를 사용하면 쉽게 만들어 낼 수 있습니다. javah를 사용하지 않는다면 JNI의 변환 규칙을 모두 알고 있어야할 겁니다.

다시 한번 같이 만들어 보겠습니다.

JniString 폴더 밑에 jni라고 하는 폴더를 생성합니다. 커멘드 창을 열어 폴더를 JniString\jni로 이동합니다. 아래 명령어를 실행합니다.
javah -classpath ../bin -o concatString.h ndk.jnistring.JniStringActivity

javah를 사용하기 위해서는 JDK가 설치되어 있는 폴더의 bin 폴더가 환경변수에 path로 등록이 되어있어야 합니다. 제 경우는
C:\Program Files\Java\jdk1.6.0_26\bin
가 경로에 포함이 되어 있습니다.

저는 윈도우즈에서 cygwin을 설치하여 사용하고 있습니다. 그러므로 여기서 이야기하는 커멘드 창이란 바로 cygwin 커멘드 창을 이야기하는 것입니다.

함수 원형에 있는 JNIEXPORT와 JNICALL은 모두 jni.h에 정의되어있습니다. JNIEXPORT는 라이브러리를 생성시 이 메써드가 제대로 export가 되도록 해줍니다. JNICALL은 C 컴파일러가 적절하게 calling convention을 구성하도록 해 줍니다.

메써드의 이름을 만드는데도 규칙이 있습니다. 제일 앞에 Java_를 붙이고 다음에는 package 명을 포함한 클래스 이름이 붙습니다.

네이티브 메써드의 구현부에는 두개의 인자가 기본으로 들어가 있습니다. JNIEnv *env와 jobject obj가 바로 그것이죠. 이중 첫번째 인자인 JNIEnv 인터페이스 포인터는 Java 가상 머신의 펑션 테이블을 가르키는 포인터입니다. 네이티브 메써드 구현에서 Java 구현부의 데이터를 접근하기 위해서는 항상 이 펑션 테이블이 제공하는 함수를 사용해야합니다.

두번째 인자는 네이티브 메써드가 스태틱인지 인스턴스인지에따라 달라집니다. 위의 예와 같이 인스턴스 메써드라면 이 메써드가 호출된 오브젝트를 참조합니다. 하지만 스태틱 메써드라면 이 메써드가 정의된 그 클래스를 참조하게 됩니다.

Java에는 크게 두가지 데이터 타입이 있습니다. 기본형(Primitive Type)과 참조형(Reference Type)입니다. Java에서 기본형은 int, float, char이고 JNI에 매칭이 되는 타입이 jni.h에 정의되어 있습니다. int는 C/C++에서는 jint입니다. jni.h에는 signed 32bit integer로 정의되어 있습니다. 다른 기본형에 대해서는 아래 표를 참고 바랍니다.

Java Language Type

Native Type

Description

boolean

jboolean

unsigned 8 bits

byte

jbyte

signed 8 bits

char

jchar

unsigned 16 bits

short

jshort

signed 16 bits

int

jint

signed 32 bits

long

jlong

signed 64 bits

float

jfloat

32 bits

double

jdouble

64 bits

JNI는 오브젝트를 전달할 때 Java 가상 머신의 내부 데이터 스트럭처를 가르키는 C 포인터를 전달합니다. 하지만 이 내부 데이터 스트럭쳐에 대한 정보는 제공하지 않습니다. 그래서 이 오브젝트의 데이터를 다루기 위해서는 JNI 함수를 사용해야만 합니다. 예를 들면 java.lang.String에 대응하는 JNI 데이터 타입은 jstring입니다. 하지만 네이티브 코드에서 jstring이 참조하는 내용을 바로 알지는 못 합니다. jstring이 참조하는 곳에 있는 실제 문자열을 얻어 오기 위해서는 JNI 함수인 GetStringUTFChars를 사용해야 합니다.

2. 문자열 얻어오기

네이티브 메써드의 구현부인 Java_ndk_JniString_JniStringActivity_concatString에서는 jstring 형의 what을 인자로 받아 옵니다. jstring은 Java 가상 머신에 있는 스트링을 가르키고 있지만 C에서 사용하는 char * 와 같지는 않습니다. 만일 아래와 같은 방식으로 what을 사용한다면 원하는 결과를 절대 얻지 못 할 겁니다.

JNIEXPORT jstring JNICALL Java_ndk_jnistring_JNIStringActivity_concatString
(JNIEnv *env, jobject obj, jstring what)
{
char buf[128];
sprintf(buf, "Hello %s", what);

.......

}

네이티브 코드에서 jstring을 C/C++에서 사용하는 문자열로 변환하기 위해서는 적절한 JNI 함수를 사용해야합니다. JNI에서는 Unicode와 UTF-8 형태의 문자열을 모두 지원합니다.

Java_ndk_JniString_JniStringActivity_concatString에서 jstring what에서 원하는 문자열을 얻어 오려면 GetStringUTFChars 함수를 사용해야합니다. 이 함수는 JNI 함수로 JNIEnv 형의 포인터인 env를 통해서 접근할 수 있습니다. 아래 코드는 이 함수의 사용 예를 보여 줍니다.

#include <string.h>
#include <jni.h>
#include "concatString.h"

JNIEXPORT jstring JNICALL Java_ndk_jnistring_JniStringActivity_concatString
(JNIEnv *env, jobject obj, jstring what)
{
char buf[128];
const jbyte *str;
str = (*env)->GetStringUTFChars(env, what, NULL);
if (str == NULL) {
return NULL; /* OutOfMemoryError already thrown */
}
sprintf(buf, "Hello %s", str);
(*env)->ReleaseStringUTFChars(env, what, str);

return (*env)->NewStringUTF(env, buf);
}

위의 코드를 concatString.c로 concatString.h와 같은 폴더인 JniString\jni에 저장합니다.

str = (*env)->GetStringUTFChars(env, what, NULL);

GetStringUTFChars는 JNI 함수로서 env 포인터를 통해서 호출을 합니다. 이 함수는 what에 담겨 있는 문자열을 반환해 줍니다. 문자열을 리턴해 주기 위해서는 Java 가상 머신 내부에 메모리 공간을 할당 받아야 합니다. 하지만 내부 메모리가 부족하다면 문자열 대신 NULL을 리턴하고 익셉션을 발생시킵니다. 그러므로 이 함수를 사용할 때는 꼭 NULL이 리턴되지 않았는지 확인해야합니다.

(*env)->ReleaseStringUTFChars(env, what, str);

네이티브 코드에서 GetStringUTFChars로 얻어온 스트링을 더 이상 사용하지 않는다면 반드시 ReleaseStringUTFChars를 호출해 주어야합니다. 이 함수를 통해서 가상 머신 내부에 할당되어 있는 메모리를 해제시켜 주어야 불필요한 메모리 낭비를 방지할 수 있습니다.

(*env)->NewStringUTF(env, buf);

C/C++ 용 문자열을 java.lang.String 형으로 변환하기 위해서는 JNI 함수인 NewStringUTF를 사용해야합니다. 이 함수는 UTF-8 형태의 문자열을 인자로 받아서 java의 String형으로 변환을 해 줍니다.

3. 컴파일, 실행

앞에서 작성한 C 파일은 NDK를 사용해서 컴파일을 합니다. 컴파일을 하기위해서는 JniString\jni 폴더에 Android.mk를 생성해야 합니다. 파일의 내용은 아래와 같습니다.

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := concatString
LOCAL_SRC_FILES := concatString.c
include $(BUILD_SHARED_LIBRARY)

폴더를 JniString로 이동하여 아래 명령어를 실행합니다. 이는 build.xml을 생성하기 위해서입니다.
android.bat update project -p . -s

ndk-build를 실행하여 컴파일을 합니다.

ndk-build

android.bat과 ndk-build를 실행하기 위해서는 이 파일이 있는 경로를 path에 포함시켜두어야 합니다.

android.bat는 C:\android-sdk-windows\tools에 있습니다. C:\android-sdk-windows는 안드로이드 SDK가 설치되어 있는 경로입니다.

ndk-build는 C:\android-ndk-r6에 있습니다. C:\android-ndk-r6는 NDK가 설치되어 있는 경로입니다.

이클립스의 Package Explorer에서 JniString-6를 클릭한 후 F5눌러 변경된 내용을 반영합니다.
Run As -> android application을 해서 지금까지 작성한 코드를 실행합니다.

생각한대로 Hello Apple이 잘 디스플레이 되었습니다.

이번 장을 통하여서 JNI 네이티브 메써드에서 Java의 String 타입의 데이터에 접근하기 위해서 JNI 함수를 사용해야한다는 것을 알았습니다.

Posted by maysent
:

JNI Basic for NDK -1

C++ 2012. 12. 27. 22:35 |

JNI Basic for NDK - 1

이 글은 안드로이드에서 NDK를 사용하기 위해 필요한 Java JNI를 튜토리얼 형식으로 설명합니다. NDK를 사용하기 위해서 알아야할 내용입니다. 또한 안드로이드 플랫폼을 개발하기위해서도 NDK를 이해하는 것이 도움이 될 것입니다.
내용을 새로 작성한 것이 아니고 Oracle(Sun을 인수했죠)에서 무료로 배포하는 아래 책의 내용을 안드로이드에 맞도록 정리한 것입니다.
“Java Native Interface: Programmer's Guide and Specification”
http://java.sun.com/docs/books/jni/ 를 참고하세요.

이 글을 이해하기 위해서는 안드로이드 어플리케이션을 이클립스 환경에서 개발해 본 경험이 있어야합니다. 또한 NDK를 설치하고 sample 예제라도 실행을 해 본 경험이 필요합니다.
NDK 설치는 아래 페이지 참고 바랍니다.
http://developer.android.com/sdk/ndk/index.html
NDK 셈플코드 실행은 아래 페이지에 나와 있습니다.
http://developer.android.com/sdk/ndk/overview.html

JNI는 Sun에서 개발한 Java Native Interface의 줄임말입니다. Java와 호스트 환경에서 사용하는 네이티브 프로그래밍 언어와 Java의 상호 호환을 위한 규격이라고 생각하면 됩니다.

안드로이드에서는 Java가 어플리케이션을 작성하는 언어입니다. 하지만 기존에 C로 된 코드를 재사용하고 싶거나 실행 속도를 빠르게 하려는 이유로 C나 C++로 어플리케이션을 작성하고자 하는 개발자를 위해서 NDK라고 하는 tool을 제공합니다. NDK는 C/C++ 컴파일러를 포함한 tool로 안드로이드 어플리케이션 프로젝트에 쉽게 사용하도록 되어있습니다.

우리가 NDK를 사용해서 C/C++를 사용하려고 하지만 Java로 작성된 어플리케이션은 반드시 있어야합니다. 어쨌는 NDK는 보조적인 수단이니까요.

1. Hello JNI as a starter
대부분의 프로그래밍 학습이 Hello world로 시작하고 있습니다. JNI의 기초를 시작하는 이번 장도 이런 관례를 따라 “Hello NDK and JNI!”를 화면에 출력하는 것으로 시작합니다. 화면에 문자열을 표시는 안드로이드 환경을 사용하고 문자열은 JNI 인터페이스로 얻어오는 간단한 프로그램입니다.
이 장을 통하여서 안드로이드 환경에서 NDK 프로그래밍을 하는 순서를 알게 될 것입니다. 또한 JNI를 구성하는 Java 코드와 C 코드의 구조도 알 수 있게 될 것입니다.
안드로이드에서 JNI를 사용하는 방법은 Java에서 JNI를 사용하는 방법과 동일합니다. 다른 점은 안드로이드 어플을 사용하고 일반 네이티브 컴파일러(C나 C++ 같은)를 사용하는 대신 구글에서 제공하는 NDK tool을 사용한다는 것입니다.
아래와 같은 순서로 하나의 NDK 프로그램이 작성됩니다.

  1. 네이티브 메써드를 사용하는 안드로이드 어플 작성하기(Java)
  2. 네이티브 메써드용 헤더 파일 만들기(.h)
  3. 네이티브 메써드 구현하기(.c)
  4. 네이티브 메써드 컴파일하기
  5. 실행하기

꼭 이 순서를 따라하는 것은 아니지만 이 순서를 따르는 것이 여러모로 편할 겁니다.

2. HelloNdkJniActivity 만들기
NDK 프로그램은 Java로 만드는 안드로이드 어플의 일부분입니다. 그러니 안드로이드 어플이 없이는 사용할 수 없죠. 간단한 Hello NDK and JNI라고 하는 어플을 만들어 보도록 하겠습니다.
이클립스에서 새 Android Project를 생성합니다. New Android Project 창에 아래와 같이 입력하고 Finish를 클릭합니다.

Project Name : HelloNdkJni
Build Target : Android 2.2
Application name : HelloNdkJni
Package name : ndk.hellondkjni


이렇게 하면 이클립스가 기본적인 HelloNdkJniActivity.java를 생성할 것입니다. HelloNdkJniActivity.java를 열어서 HelloNdkJniActivity class 를 아래와 같이 수정합니다.

public class HelloNdkJniActivity extends Activity {
/** Called when the activity is first created. */

public native String stringFromJNI();

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

TextView tv = new TextView(this);
tv.setText( stringFromJNI() );
setContentView(tv);
}

static {
System.loadLibrary("hello-jni");
}
}


HelloNdkJniActivity class의 앞 부분에 stringFromJNI 네이티브 함수를 선언 하고 있습니다. 이 함수는 앞으로 C로 작성할 겁니다. "Hello NDK and JNI !"라는 문자열을 리턴하는 간단한 함수죠.
그리고 onCreate에서 이 함수를 호출하여 문자열을 받아 옵니다.

맨 마지막에 System.loadLibrary를 호출하여 stringFromJNI가 구현되어 있는 네이티브 라이브러리를 로드합니다.

public native String stringFromJNI();
네이티브 메써드와 일반 메써드를 구분하기 위해서 native라고 하는 형변환자가 쓰입니다. native를 붙여 이 메써드는 java가 아닌 다른 언어로 구현이 되어 있다는 것을 알려줍니다. 당연히 실제 구현이 여기에 없으니 그냥 세미콜론(;)으로 끝나죠.


static {
System.loadLibrary("hello-jni");
}
System.loadLibrary는 네이티브 라이브러리를 어플리케이션으로 읽어 들입니다. 인자로 들어가는 것은 라이브러이 이름인데 NDK의 확장자인 .so를 제외한 이름만 들어갑니다. 이 라이브러리는 당현히 stringFromJNI 가 호출되기 전에 로드가 되어야합니다. 그래서 static을 붙여 이 클래스의 어떤 함수보다 먼저 초기화 되도록 해야합니다.
자 이대로 실행을 한 번 해 볼까요? 하지만 실행이 되지 않습니다. 아직 네이티브 라이브러리를 만들지 않았기 때문이죠.


3. 네이티브 메써드 헤더파일
JNI에서는 네이티브 메써드와 자바 코드 간의 호환을 위해 몇가지 특별한 네이밍 규칙을 가지고 있습니다. 아래 표에는 그 중 하나의 예입니다.

Java Language Type

Field Descriptor

String

"Ljava/lang/String;"

Int[]

"[I"

Object[]

"[Ljava/lang/Object;"

복잡하죠? 차라리 이런 것은 모르고 살고 싶습니다.


다행히도 아주 편리한 방법이 있습니다. 이를 편하게 도와주는 javah라고 하는 툴을 쓰면 됩니다. 이 툴을 사용해서 생성되는 헤더를 보고 실제 메써드를 구현합니다. javah를 사용하기 위해서는 JDK가 설치되어 있는 폴더의 bin 폴더가 환경변수에 path로 등록이 되어있어야 합니다.

제 경우는
C:\Program Files\Java\jdk1.6.0_26\bin
가 경로에 포함이 되어 있습니다.


HelloNdkJni 폴더 밑에 jni라고 하는 폴더를 생성합니다. 커멘드 창을 열어 폴더를 HelloNdkJni\jni로 이동합니다. 아래 명령어를 실행합니다.
javah -classpath ../bin -o hello-ndkjni.h ndk.hellondkjni.HelloNdkJniActivity

저는 윈도우즈에서 cygwin을 설치하여 사용하고 있습니다. 그러므로 여기서 이야기하는 커멘드 창이란 바로 cygwin 커멘드 창을 이야기하는 것입니다.


classpath 옵션으로는 ../bin 을 줍니다. -o로 생성될 헤더의 이름을 정해 줍니다. 마지막으로 페키지 이름을 포함한 클래스 이름을 지정해 줍니다.
이클립스의 Package Explorer에서 프로젝트 이름에 마우스를 놓고 오른쪽 버튼을 클릭합니다. 그리고 refresh를 해 봅니다. 헤더 파일이 하나 생성된 것을 보실 수 있을 겁니다.

생성된 hello-ndkjni.h 의 내용 중에 중요한 내용은 이것입니다.
JNIEXPORT jstring JNICALL Java_ndk_hellondkjni_HelloNdkJniActivity_stringFromJNI
(JNIEnv *, jobject);
이 함수가 앞의 안드로이드 java 코드에서 사용된 stringFromJNI의 원형입니다. JNIEXPORT 와 JNICALL 에 대해서는 설명을 하지 않도록 하겠습니다. 대신 함수의 인자를 보시기 바랍니다. java에 사용된 네이티브 메써드에는 인자가 없었는데 여기는 두개가 있습니다. 일단 여기서는 javah 가 알아서 필요한 내용을 생성해 주었으니 자세한 내용은 차차 알아보도록 하겠습니다.

자 이제 실제 C 코드를 구현할 차례입니다.

4. 네이티브 메써드 구현
네이티브 메써드는 javah에 의해서 생성된 함수 원형을 사용해서 만들어야 합니다. hello-ndkjni.c를 아래와 같이 작성합니다.

#include <string.h>
#include <jni.h>
#include "hello-ndkjni.h"

jstring
Java_ndk_hellondkjni_HelloNdkJniActivity_stringFromJNI( JNIEnv* env,
jobject obj )
{
return (*env)->NewStringUTF(env, "Hello NDK and JNI !");
}


함수의 원형은 hello-ndkjni.h에서 만들어진 것을 그대로 사용하고 있습니다.

메써드 구현의 자세한 내용은 차차 이해가 될 것입니다. 그냥 "Hello NDK and JNI !"를 리턴하는 메써드라는 정도만 알고 넘어 가도록 하겠습니다.
jni.h 는 네이티브 코드가 JNI 함수를 호출하는데 필요한 정보를 담고 있습니다. 그러므로 모든 C나 C++ 소스에 항상 인크루드를 해야하는 헤더입니다.

5. 네이티브 소스 컴파일
앞에서 작성한 C 파일은 NDK를 사용해서 컴파일을 합니다. 컴파일을 하기위해서는 HelloNdkJni\jni 폴더에 Android.mk를 생성해야 합니다. 파일의 내용은 아래와 같습니다.

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-ndkjni
LOCAL_SRC_FILES := hello-ndkjni.c
include $(BUILD_SHARED_LIBRARY)

이제 jni 폴더에는 모두 3개의 파일이 만들어 졌습니다.


폴더를 HelloNdkJni로 이동하여 아래 명령어를 실행합니다. 이는 build.xml을 생성하기 위해서입니다.
android.bat update project -p . -s


HelloNdkJni 폴더에서 ndk-build를 실행하여 컴파일을 합니다.
ndk-build


android.bat과 ndk-build를 실행하기 위해서는 이 파일이 있는 경로를 path에 포함시켜두어야 합니다.

android.bat는 C:\android-sdk-windows\tools에 있습니다. C:\android-sdk-windows는 안드로이드 SDK가 설치되어 있는 경로입니다.

ndk-build는 C:\android-ndk-r6에 있습니다. C:\android-ndk-r6는 NDK가 설치되어 있는 경로입니다.


6. 실행하기
이클립스의 Package Explorer에서 HelloNdkJni를 클릭한 후 F5눌러 변경된 내용을 반영합니다.
Run As -> android application을 해서 지금까지 작성한 코드를 실행합니다.

위에 보이는 화면과 같이 표시가 되면 Hello NDK and JNI 프로그램은 성공을 한 것입니다.

이제부터는 몇가지 데이터 형을 어떻게 사용해야하는지와 함수를 어떻게 다루어야하는 지를 배우면 됩니다. NDK를 실행하기 위한 과정이 좀 귀찮기는 하지만 그래도 할만 하죠?

'C++' 카테고리의 다른 글

문자열 비교는 == 비교연산자 와 strcmp 어떤걸 써야 하는가..  (0) 2013.10.10
자바 객체의 사용 - NDK  (0) 2012.12.27
JNI Basic for NDK -4  (0) 2012.12.27
JNI Basic for NDK -3  (0) 2012.12.27
NDK C++ 자료  (0) 2012.12.27
Posted by maysent
:

NDK C++ 자료

C++ 2012. 12. 27. 22:34 |

업데이트 한 날짜:2010년 7월 25일 오후 5시 0분

C언어강좌_(쉬운_C언어_입문서)


#define문의 ##의 기능
1-1 우선은 계산 결과를 표시
1-2 변수
1-3 읽기 와 표시
16진수에 대해서
2-1 연산
2-2 캐스트, 변환지정
2-2 형
3-1 if문
3-1 등가연산자, 관계연산자
3-1 삼항조건연산자, 블록문, 논리연산자
3-2 switch 문
C Programming FAQs
C Promgram C-language -1
C Promgram C-language -10
C Promgram C-language -11
C Promgram C-language -2
C Promgram C-language -3
C Promgram C-language -4
C Promgram C-language -5
C Promgram C-language -6
C Promgram C-language -7
C Promgram C-language -8
C Promgram C-language -9
C 언어에서 자주 사용되는 함수정리
C 프로그래밍
C 프로그래밍 및 실습
const 제한자
c언어 강좌 (e-book)
C언어 강좌 링크 -- C언어 길라잡이
C언어 강좌 링크 -- 이상엽의 C 강좌(ppt + 음성)
C언어 강좌 시작합니다.
fwrite(),fread()
new, malloc의 차이점
printf 의 인자들
printf 함수에서 사용되는 type
strdup() 함수설명
Teach Yourself C in 21 Days (영문, e-book)
Turbo C을 사용한 C 프로그래밍
간단한 C언어 프로그램 소개 // written by yonghoon
링크드 리스트
목차
배열과 포인터
소스파일의 구조 // written by yonghoon
입력함수 scanf(), gets(), fgets() - part1
포인터 부수기. (부제: 2차원배열 포인터로, 배열내 항목들을 다루기)
포인터 부수기. (부제: getchar())
포인터 부수기. (부제: malloc()와 new의 차이점)
포인터 부수기. (부제: void형 포인터)
포인터 부수기. (부제: 가변인자)
포인터 부수기. (부제: 구조체와 포인터)
포인터 부수기. (부제: 널포인터)
포인터 부수기. (부제: 동적메모리 할당) part1
포인터 부수기. (부제: 문자열과 포인터)
포인터 부수기. (부제: 문자열과 포인터배열)
포인터 부수기. (부제: 배열과 포인터)
포인터 부수기. (부제: 배열이란 )
포인터 부수기. (부제: 배열포인터를 함수에 넘기기)
포인터 부수기. (부제: 이차원배열)
포인터 부수기. (부제: 이차원배열과 포인터) 2
포인터 부수기. (부제: 이차원배열과 포인터)- 1
포인터 부수기. (부제: 포인터는 c언어의 꽃이다.)
포인터 부수기. (부제: 포인터배열)
포인터 부수기. (부제: 포인터변수에 왜 타입을 선언할까)
포인터 부수기. (부제: 포인터와 const 키워드)
포인터 부수기. (부제: 포인터의 포인터)
포인터 부수기. (부제: 포인터의 형식)
포인터 부수기. (부제: 함수포인터)
포인터 스터디-1
포인터 스터디-2
포인터 스터디-3
포인터 스터디-4
포인터 스터디-5
포인터 스터디-6
포인터 스터디-7
포인터 스터디-8
포인터 한번 때려잡아 봅시다! 첫번째~
포인터란 1
포인터란 2
포인터란 3
포인터의 포인터-1
함수포인터 강좌-1
함수포인터 강좌-2




업데이트 한 날짜:2010년 6월 13일 오후 3시 59분

C_C++_Tip


structure의 초기화
C/C++에서 mysql 다루기
token 함수 구현
C++에서 C함수의 사용시는 extern으로 c함수를 지정해줘야 합니다.
tc++로 구현한 돌 빠드리기 게임 소스
c++로 만든 달력소스
문자열을 대문자형태/소문자형태로 변환
정렬 알고리즘
Bubble Sort 개선
로또 소스
소수(prime number) 체크 예제
간단한 계산기 예제
간단한 자료구조 stack을 사용 예제
간단한 버플소트 예제
10진수를 2, 8, 16 진수로 변환하는 소스
WinSocket을 이용한 Http 프로토콜 간단한 예제
디지털시계 소스
VC++ 커스텀 컨트롤 예제들
VC++로 구현한 헥사게임 소스
파일입출력을 이용한 성적관리 소스
연산자 오버로딩에 대한 간단한 소스
strcpy, strcat, strlen, strrev, strupr, strlwr, strcmp 함수 구현소스
현재 날짜/시간을 출력하는 time 클래스 구현소스
숫자3자리 맞추는 야구게임 소스
빵집 운영 시뮬레이션 프로그램 소스
Mathematical expression parser(수식계산기) in C++
binary tree 소스
특정한 디렉터리내 파일의 정보를 출력하는 소스 (turbo-c++ 1.0으로 작성됨)
자신의 컴퓨터의 논리적인 드라이브(logical drive) 정보 출력 소스
c언어로 구현한 주소록 소스
template
c/c++ 를 공부하는 분들에게..
c++ static const 변수 선언
MFC 사용시 라이브러리가 없을때...
속도를 높히려면~~
속도를 높히려면~~
속도를 높히려면~~
정수형 자료형이 표현할수 있는 수의 범위
NULL과 0과 '\0'의 차이점은
USB 장치 연결/연결해제 이벤트 처리...
화면 잠그기
BitArray클래스 소스 코드
WM_NCLBUTTONDOWN 메시지의 활용
30초만에 만드는 메트로놈 프로그램
농부,늑대,양,야채 게임
포맷되지 않은 2진 입출력
화일 입출력의 기초
다중상속
이항 연사자 중복 (2)
이항 연산자의 중복
상속의 가시성 표
iostream (width(), precisio(), fill() 예제)
C++ 입출력조작자
랜덤함수란..
Ctrl+z 눌러서 빠져나오기
간단한 c로 짠 비디오가게 프로그램
데이터구조 queue의 내용을 거꾸로 뒤집기
Smart Pointer in C++
배열로 구현한 큐(Queue) 소스
stack 스택 구현소스
간단한 이미지 처리 방법
간단한 슬롯머신 게임
ansi와 unicode 사이의 변환
좋은 프로그래밍이란...
프로그래밍 팁
CSV Parser
암호화 라이브러리 CL32 샘플
using namespace std;; 에 관하여.. 질문입니다!
프로그래머를 위한 폰트
프로그래밍을 할 때 사용하는 폰트
C++ 오늘의 비결 - switch문에 꼭! default를 넣자
C++ 오늘의 비결 - 객체없이 멤버 함수 부르기
[퍼옮] memecpy보다 빠르다.
Visual C++ 에서 clrscr(), gotoxy(), setrgb()쓰기
시간구하는 함수계열 예제소스 ( time, ctime 등 )
해시(hash)로 구현한 간단한 주소록
문자열 검색과 치환
이거 볼수 있게 해주시면 안될까요..ㅜ.ㅜ
피보나치 수열
긴자리수(매우큰수)의 정수 곱셈과 나눗셈
긴자리수(매우큰수)의 정수 덧셈과 뺄셈
An extensible math expression parser with plug-ins (c++ 수식계산기)
파일 복사
단일 링크드 리스트 스왑, 정렬하기
단일 링크드 리스트 스왑, 정렬하기
간단한 계산기 소스
유클리드의 호제법
Test용소스 또는 확정구문에대한 예비주석처리
헝가리언 표기법
디버깅시 정보를 파일로 저장 시켜주는 c++ 클래스
visual studio 2010, vc9 로 빌드하기
Use list.assign to replace contents of a list with elements of another list
C언어로 MySql을 사용하자
Dump 파일 떨구기, 확인하기
간단한 gcc로 컴파일 하는 방법입니다~
간단한 gcc로 컴파일 하는 방법입니다~
초심자 에러 메시지 Q&A
Visual Studio 2008 로 C/C++ 공부 시작하기
레퍼런스 검색(with google)
웹로봇/ 검색엔진
htlmparser - tidy
htlmparser - tidy
다음(Daum) 개발자 네트워크 C++ 관련 여러가지 팁
refactoring
vc 관련 툴~
c++에서 volatile과 mutable에 대한 사용방법과 예제
CPPUNIT 설치방법
재귀템플릿
간단하게 c++로 만든 비디오샵 프로그램
함수의 호출 규약에 대해서 알아봅시다
new로 클래스 동적 배열 생성시, 인자를 가지는 생성자 호출하려면..
std::string용 printf 함수
가중치를 부여한 랜덤처리
rand() 함수 - 난수생성
지정시간과 현재시간 비교 with C 표준함수
참조호출시 *가 아닌 &로 쉽게 호출하기
문자열을 숫자로 변환하는 방법
에디터플러스에서 c/c++ 실행시키기
vector내 반복자(iterator)를 사용하여 항목들에 접근하는 간단한 예제
ostream_iterator을 사용하여 표준컨테이너(list, vector..)내 항목들을 화면에 출력하기
오목게임소스 (TuroboC용)
가위바위보 소스
여러가지 별모양 출력하는 소스입니다.
문자열을 역순,오름차순정렬,알파벳 개수,문자열의 길이 구하는 소스
간단한 마방진 소스
파라미터 초기화
함수에 가변인자 사용하기 (va_list, va_arg, va_arg)
함수에 가변인자 사용하기 (va_list, va_arg, va_arg)
피보나치(Fibonacci) 수열
계승(factorial) 과 거듭제곱(power)
행렬의 덧셈, 뺄셈, 곱셈 연산
실수를 진법변환하기 (실수==> 2진수, 8진수, 16진수)
정수를 진법변환하기 (10진수 ==> 2진수, 8진수, 16진수)
최대공약수와 최소공배수
소수구하기
최소수 구하기
최대수 구하기
바이오리듬 구하는 소스
바이오리듬 구하는 소스
serial 통신 소스
Beep함수를 사용하여 도레미.. 음 출력하기
자바의 String클래스의 toUpperCase()과 동일한 기능을 가지는 함수구현
한점을 중심으로 해서, 특정좌표를 몇도 만큼 회전한 좌표를 구하기
vc++로 디버그시 자바 콘솔창 처럼 창 띄워서 디버그하기
멀티쓰레드에서도 안전한 singleton
간단하게 만든 singleton
실수를 소수점 n짜리까지 반올림 처리하기
컴파일, 링크및 실행을 위해 사용되는 명령어
C/C++ 함수 레퍼런스


STL

(stl:list) Move position pointer and insert again
(stl:list) Initialize a list with values in a vector
(stl:list) Fill list with random numbers with generate function
(stl:list) Combine insert and end to add elements to the end of a list
(stl:list) Combine insert and begin to add element to the start of a list
(stl:list) Insert elements of array into a list
(stl:list) list begin end
(stl:list) Use reverse function on list
(stl:list) Find the maximum element in a range in a list
(stl:list) Find element in a list
(stl:list) Add data by assign
stl의 reverse 함수 사용예제
stl의 find 함수 사용예제
stl의 list assign 사용예제2
stl의 list assign 사용예제
메모리풀 간단히 쓰고 싶은데 특별한 라이브러리가 없고 VS만 설치되어 있을 때
stl 이용한 메모리풀
VC++ 메모리풀
stl(vector)를 멀티쓰레드에서 안전하게 사용하기 (크리티컬 사용)
Kyuseo’s C++ 프로그래밍 스타일 가이드라인
stlreplace 자작함수
stl의 min 과 max
stl의 include 알고리즘
stl의 find(), find_if()
stl 컨테이너의 반복자(begin(), end()) 설명
stl의 advance() 함수
stl의 list내 반복자(iterator)를 사용하여 항목들에 접근하는 간단한 예제
stl의 copy, vector, for_each 함수 사용예제
stl의 sort, random_shuffle, greater<int> 함수 사용예제</int>
stl의 string(문자열)을 토큰 처리하는 클래스 separator
stl의 vector, sort, random_shuffle, for_each, greater을 이용한 간단한 예제
map 과 hash_map 속도차이
STL 간단한 사용 방법 (vector, list, hash_map, string)
stl의 vector사용예제및 방법
stl을 사용하여 텍스트파일을 한줄씩 읽기



Boost

boost의 gregorian (날짜계산)
boost의 lexical_cast 문자열을 숫자로, 숫자를 문자열로 변환해주는 함수
boost의 정규표현식 사용법
boost의 tokenizer 사용법
boost 둘러보기/빌드하기
boost::interprocess (프로세스간 공유 메모리)
boost::serialization
property_tree
boost::iostreams (간단한 iostream 작성)
boost::io::ios_state
boost::filesystem (파일, 디렉터리 다루기)
boost::asio (네트웍 비동기 IO)
boost::progress_display (stop watch)
boost::progress_timer (stop watch)
boost::timer (stop watch)
boost::posix_time (일시, 시각)
boost::gregorian (일시, 시각)
boost::flyweight
boost::intrusive_ptr
boost::weak_ptr (스마트 포인터)
boost::shared_ptr (스마트 포인터)
boost::scoped_array (스마트 포인터 배열)
boost::scoped_ptr
boost::pool (메모리 풀)
boost::xpressive (정규표현식 관련)
boost::tokenizer (문자열 토큰)
boost::algorithm (문자열 관련 알고리즘)
boost::spirit (구문구성)
boost::regex (정규표현식)
boost::lexical_cast (뭐든 문자열로 변환)
boost::format (printf 기능)
factory 함께 고민해보기
빌드시간 줄이기
Visual Studio 2005 에는 std::tr1 이없다!
boost의 function 함수
boost의 bind 함수
boost의 optional
boost의 turple
boost의 any
boost의 multi_array
배열 복사
boost의 array (배열)
boost의 interval (숫자사이의 구간표현)
boost의 rational
boost의 random
boost의 mutex
boost의 thread
boost의 filesystem
boost의 posix_time (시간계산)



업데이트 한 날짜:2010년 7월 25일 오후 5시 4분

C++_강좌


-- C/C++관련된 문서및 강좌 링크
-- 김상형님의 강좌 목차 정리
-- 김상형님의 강좌1 OOP소개및 목차 (1장 C++확장)
-- 김상형님의 강좌10 2-5 friend 함수의 개념
-- 김상형님의 강좌11 2-6 클래스 배열 및 포인터
-- 김상형님의 강좌12 2-7 shtet2 분석
-- 김상형님의 강좌13 3-1 C++의 부품 (3장 특성계층)
-- 김상형님의 강좌14 3-2 상속
-- 김상형님의 강좌15 3-3 가상 함수
-- 김상형님의 강좌16 3-4 다중 상속
-- 김상형님의 강좌17 4-1 연산자 함수 (4장 연산자 오버로딩)
-- 김상형님의 강좌18 4-2 friend 연산자 함수
-- 김상형님의 강좌19 4-3 연산자 오버로딩 규칙
-- 김상형님의 강좌2 1-1 I/O stream 소개
-- 김상형님의 강좌20 4-4 오버로딩 예
-- 김상형님의 강좌21 5-1 정적 멤버 (5장 OOP)
-- 김상형님의 강좌22 5-2 const 멤버
-- 김상형님의 강좌23 5-3 this 포인터
-- 김상형님의 강좌24 5-4 데이터형 변환
-- 김상형님의 강좌25 5-5 동적 객체 생성
-- 김상형님의 강좌26 5-6 템플릿
-- 김상형님의 강좌27 5-7 OOP 일반 이론
-- 김상형님의 강좌28 6-1 출력 (6장 I/O 스트림)
-- 김상형님의 강좌29 6-2 출력 형식 지정
-- 김상형님의 강좌3 1-2 문법적 엄격성
-- 김상형님의 강좌30 6-3 입력
-- 김상형님의 강좌31 6-4 파일 입출력
-- 김상형님의 강좌31 6-5 iostream.h의 분석
-- 김상형님의 강좌4 1-3 확장된 기능
-- 김상형님의 강좌5 1-4 첨가된 기능
-- 김상형님의 강좌6 2-1 구조체의 확장 (2장 클래스)
-- 김상형님의 강좌7 2-2 class
-- 김상형님의 강좌8 2-3 생성자, 파괴자
-- 김상형님의 강좌9 2-4 Access 권한 지정자
All About: File I/O in C++ (.doc 파일)
C++ Programming 기초강좌
C++ 강좌 -- C++ Complete Guide.chm (chm형태의 C++ 강좌 파일입니다.) -1
C++ 강좌 -- C++ Complete Guide.chm (chm형태의 C++ 강좌 파일입니다.) -2
C++ 강좌 링크 -- C++언어 길라잡이
C++ 강좌 링크 -- 지키미 기초강좌 C++ Programing
C++ 기초 (생각하는 C++)
c++ 클래스 기초강좌
c++ 프로그래머가 코드 작성시 유의할점 10가지
C++기초강좌 (ppt로 작성)
C++와 객체지향 프로그래밍 개요 링크 (Visual C++사용법 포함)
C++의 namespace
class 란
const 키워드 총정리
const, enum, extern, static 키워드
double사용시 나머지 구하기....
extern "C"
extern 의미
free() 함수는 어떻게 해제할 메모리영역의 크기를 알까요
friend 클래스
friend 함수
MFC 클래스동적생성 - RTTI (run-time type informtion)
static_cast<> 와 reinterpret_cast<>. 의 차이(영문)
static_cast<> 와 reinterpret_cast<>. 의 차이(영문)
static의 의미
std::string::size_type 을 사용하는 이유
STL 강좌 링크 -- stl tutorial by sjjung
stl 개념 정리
stl 알고 보면 쉽다. std::binary_function
stl 알고 보면 쉽다. std::deque
stl 알고 보면 쉽다. std::list -1
stl 알고 보면 쉽다. std::list -2
stl 알고 보면 쉽다. std::list -3 (list 사용예제)
stl 알고 보면 쉽다. std::map-1
stl 알고 보면 쉽다. std::map-2
stl 알고 보면 쉽다. std::set
stl 알고 보면 쉽다. std::set 주요함수
stl 알고 보면 쉽다. std::sort
stl 알고 보면 쉽다. stl 관련 몇개의 팁
stl 알고 보면 쉽다. stl과 멀티쓰레드
stl 알고 보면 쉽다. string
stl 알고 보면 쉽다. string 예제
stl 알고 보면 쉽다. vector
stl 알고 보면 쉽다. vector 예제(at, [])
stl 알고 보면 쉽다. vector 크기 줄이기
stl 알고 보면 쉽다. 확장된 string
stl 알고 보면 싶다. string 관련 자작함수
STL 입문자를 위한
Thinking In C++ (Second Edition) e-book
vc++ 6.0 에선 템플릿은 컴파일시 소스가 생성된다
Wrox Press C++ tutorial (e-book)
가상함수 1
대충강좌. 대충설명한다. friend 함수
대충강좌. 대충설명한다. 가상함수 동작원리
대충강좌. 대충설명한다. 객체배열
대충강좌. 대충설명한다. 객체생성
대충강좌. 대충설명한다. 객체의 복사
대충강좌. 대충설명한다. 객체의 포인터
대충강좌. 대충설명한다. 랜덤파일
대충강좌. 대충설명한다. 생성자/소멸자 호출순서
대충강좌. 대충설명한다. 생성자의 콜론초기화
대충강좌. 대충설명한다. 연산자 오버로딩 (<< 연산자)
대충강좌. 대충설명한다. 연산자 오버로딩 (friend 함수)
대충강좌. 대충설명한다. 연산자 오버로딩 (멤버함수)
대충강좌. 대충설명한다. 완전가상함수/추상클래스
대충강좌. 대충설명한다. 이진파일
대충강좌. 대충설명한다. 이진파일에서 내용읽기
대충강좌. 대충설명한다. 정적멤버변수
대충강좌. 대충설명한다. 정적멤버함수
대충강좌. 대충설명한다. 정적바인딩, 동적바인딩
대충강좌. 대충설명한다. 클래스란
대충강좌. 대충설명한다. 클래스의 상속
대충강좌. 대충설명한다. 템플릿(Template)
대충강좌. 대충설명한다. 템플릿(Template) 클래스
대충강좌. 대충설명한다. 파생클래스의 포인터를 기본클래스로 형변환
대충강좌. 대충설명한다. 파일입출력 (파일입력)
대충강좌. 대충설명한다. 파일입출력 (파일출력)
대충강좌. 대충설명한다. 표준입출력(cin,cout) -1
대충강좌. 대충설명한다. 표준입출력(cin,cout) -2
대충강좌. 대충설명한다. 프로그램에 파라미터 넘기기
대충강좌. 대충설명한다. 함수의 재정의(오버라이딩)
비주얼 C++ 질문~~
선행처리기란
연산자 오버로딩-1
연산자 오버로딩-2
예외처리-1
예외처리-2
정렬된 링크드리스트(ordered linked list)
클래스의 다형성
템플릿 (template)
트리 강좌
프로그래머의길 C++편.pdf
프로그래밍 개발격언
함수대신 function object를 대입하자 accumulator
해쉬와 맵의 차이점이 뭔가요

'C++' 카테고리의 다른 글

문자열 비교는 == 비교연산자 와 strcmp 어떤걸 써야 하는가..  (0) 2013.10.10
자바 객체의 사용 - NDK  (0) 2012.12.27
JNI Basic for NDK -4  (0) 2012.12.27
JNI Basic for NDK -3  (0) 2012.12.27
JNI Basic for NDK -1  (0) 2012.12.27
Posted by maysent
: