Android NDKでC++を利用する

Test113_01.png
これまでAndroidのネイティブコードをC言語で扱った。しかしC言語だとクラスは使えないし、メモリ確保も面倒なのでこれからはC++を利用する。まずソースコードの拡張子をcppに変更する。

Test113_02.png AndroidでJavaとネイティブの橋渡しをするJNIの記述がC言語とC++とでは異なる。コメントアウトしたのがC言語での書き方。C++の方がスマートだ。
#include <string.h>
#include <jni.h>
#include <android/log.h>


class CTest113
{
public:
	CTest113()
	{
		__android_log_write(ANDROID_LOG_DEBUG,"Test113","CTest113::CTest113()");
	}

	~CTest113()
	{
		__android_log_write(ANDROID_LOG_DEBUG,"Test113","CTest113::~CTest113()");
	}

	void	TestFunc()
	{
		__android_log_write(ANDROID_LOG_DEBUG,"Test113","CTest113::TestFunc()");
	}
};

extern "C" jstring
Java_com_Test113_Test113Act_stringFromJNI(JNIEnv* env,jobject thiz)
{
	CTest113*	pcTest;

	pcTest = new CTest113;
	pcTest->TestFunc();
	delete	pcTest;

	return env->NewStringUTF("Test113text");
//	return (*env)->NewStringUTF(env, "Test113text");
}

Test113_03.png Android.mkでC言語からC++に変更するのはソースファイル指定の拡張子を変えるだけだ。今回はログ出力を利用するので-llogも追加した。
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := Test113jni
LOCAL_SRC_FILES := Test113jni.cpp
LOCAL_LDLIBS    := -llog

include $(BUILD_SHARED_LIBRARY)

Test113_04.png
これで実行するとC++のクラスが生成、破棄されてそれがログに出力されたことが、DDMSのLogCatで確認できた。

プロジェクトファイルをダウンロード


カテゴリー「android」 のエントリー