雛形作成

概要

雛形作成


準備

Android SDKの雛形作成と同様の方法でプロジェクトを作成する


手順

指定のプロジェクトを選択して、右クリックし、「Androidツール」>「Add Native Support」をクリック


モジュール名を設定


コンソールに「Unable to launch cygpath. Is Cygwin on the path?…」のようなメッセージが表示されるが無視して良い


jniなどのディレクトリが作成されていることを確認


コマンドプロンプトより移動して、アクティビティのcppファイル用のヘッダーファイルを作成

C:\Users\xxxx>cd C:\Users\xxxx\Desktop\adt-bundle-windows-x86_64-20130219\workspace\Sample\jni
 
C:\Users\xxxx\Desktop\adt-bundle-windows-x86_64-20130219\workspace\Sample\jni>
  javah 
     -o ./sample.hpp 
     -classpath "../bin/classes;../../../sdk/platforms/android-7/data/layoutlib.jar;" 
     app.example.sample.MainActivity
 
C:\Users\xxxx\Desktop\adt-bundle-windows-x86_64-20130219\workspace\Sample\jni>
 
 

sample.hppの中身
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class app_example_sample_MainActivity */
 
#ifndef _Included_app_example_sample_MainActivity
#define _Included_app_example_sample_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
#undef app_example_sample_MainActivity_MODE_PRIVATE
#define app_example_sample_MainActivity_MODE_PRIVATE 0L
#undef app_example_sample_MainActivity_MODE_WORLD_READABLE
#define app_example_sample_MainActivity_MODE_WORLD_READABLE 1L
#undef app_example_sample_MainActivity_MODE_WORLD_WRITEABLE
#define app_example_sample_MainActivity_MODE_WORLD_WRITEABLE 2L
#undef app_example_sample_MainActivity_MODE_APPEND
#define app_example_sample_MainActivity_MODE_APPEND 32768L
#undef app_example_sample_MainActivity_BIND_AUTO_CREATE
#define app_example_sample_MainActivity_BIND_AUTO_CREATE 1L
#undef app_example_sample_MainActivity_BIND_DEBUG_UNBIND
#define app_example_sample_MainActivity_BIND_DEBUG_UNBIND 2L
#undef app_example_sample_MainActivity_CONTEXT_INCLUDE_CODE
#define app_example_sample_MainActivity_CONTEXT_INCLUDE_CODE 1L
#undef app_example_sample_MainActivity_CONTEXT_IGNORE_SECURITY
#define app_example_sample_MainActivity_CONTEXT_IGNORE_SECURITY 2L
#undef app_example_sample_MainActivity_CONTEXT_RESTRICTED
#define app_example_sample_MainActivity_CONTEXT_RESTRICTED 4L
#undef app_example_sample_MainActivity_RESULT_CANCELED
#define app_example_sample_MainActivity_RESULT_CANCELED 0L
#undef app_example_sample_MainActivity_RESULT_OK
#define app_example_sample_MainActivity_RESULT_OK -1L
#undef app_example_sample_MainActivity_RESULT_FIRST_USER
#define app_example_sample_MainActivity_RESULT_FIRST_USER 1L
#undef app_example_sample_MainActivity_DEFAULT_KEYS_DISABLE
#define app_example_sample_MainActivity_DEFAULT_KEYS_DISABLE 0L
#undef app_example_sample_MainActivity_DEFAULT_KEYS_DIALER
#define app_example_sample_MainActivity_DEFAULT_KEYS_DIALER 1L
#undef app_example_sample_MainActivity_DEFAULT_KEYS_SHORTCUT
#define app_example_sample_MainActivity_DEFAULT_KEYS_SHORTCUT 2L
#undef app_example_sample_MainActivity_DEFAULT_KEYS_SEARCH_LOCAL
#define app_example_sample_MainActivity_DEFAULT_KEYS_SEARCH_LOCAL 3L
#undef app_example_sample_MainActivity_DEFAULT_KEYS_SEARCH_GLOBAL
#define app_example_sample_MainActivity_DEFAULT_KEYS_SEARCH_GLOBAL 4L
/*
 * Class:     app_example_sample_MainActivity
 * Method:    stringFromJNI
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_app_example_sample_MainActivity_stringFromJNI
  (JNIEnv *, jobject);
 
/*
 * Class:     app_example_sample_MainActivity
 * Method:    unimplementedStringFromJNI
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_app_example_sample_MainActivity_unimplementedStringFromJNI
  (JNIEnv *, jobject);
 
#ifdef __cplusplus
}
#endif
#endif
 
 


jni配下にある、cppファイルを編集して関数を作成

sample.cpp
#include <jni.h>
#include <string.h>
#include <sample.hpp>
 
JNIEXPORT jstring JNICALL Java_app_example_sample_MainActivity_stringFromJNI
  (JNIEnv *env, jobject)
{
	return (env)->NewStringUTF("Jni Test Sample");
}
 
 
※作成したsample.hppを必ず指定する必要があります。

アクティビティにモジュールの機能を組み込む

MainActivity.java
package app.example.sample;
 
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;
import app.example.sample.R;
 
public class MainActivity extends Activity {
 
	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        // テキストビューのオブジェクトを取得して文字列を設定
        TextView text1 = (TextView) findViewById(R.id.textView1);
        String a = stringFromJNI();
        text1.setText(a);
 
     }
 
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
 
    // NDKの定義
    public native String  stringFromJNI();
    public native String  unimplementedStringFromJNI();
    static {
	    System.loadLibrary("sample");
	}
 
 
}
 
 

cppファイルをコンパイル

C:\Users\xxxx\Desktop\adt-bundle-windows-x86_64-20130219\workspace\Sample\jni>ndk-build
"Compile++ thumb : sample <= sample.cpp
StaticLibrary  : libstdc++.a
SharedLibrary  : libsample.so
Install        : libsample.so => libs/armeabi/libsample.so
 
C:\Users\xxxx\Desktop\adt-bundle-windows-x86_64-20130219\workspace\Sample\jni>
 

eclipseよりjniフォルダに"Application.mk"を作成して、以下の値を設定

APP_PLATFORM := android-8
 

ビルドして、実機にて確認




最終更新:2013年05月12日 13:10