like life lives

技術以外のことに興味が寄りすぎな技術ブログ

Android(Java)でプリミティブ型の配列の降順ソートがめんどくさい:その2 - NDKでかるく炙ってみました

前回のエントリの最後で

「プリミティブ型の降順ソートしたかったらNDK使えばいいじゃない」

マリー・アントワネット的なことを書いたもののやったことがなかったので、裏をとるためにやってみました。

環境

1.NDKをダウンロードする

http://developer.android.com/tools/sdk/ndk/index.html

  • eclipse のNDKプラグインをインストール
  • preference -> Android -> NDKでディレクトリ指定
  • CDTもインストールする

*ここらへんはNDK導入の説明なので省略

2.ひな型を作成

プロジェクトを右クリックしてAndroid Tools -> Add Native Supportをクリック。

ダイアログが出たら、今回は libmysort.so を作るので mysort と入力します。

ひな型としてjniフォルダの下に

ができあがっていると思います。

3.jni/Application.mkを作成

STLを使用するのに必須なので、jniフォルダの下にApplication.mkを新規作成し、以下の一行を加えます。

APP_STL := stlport_static

4.ネイティブメソッドを宣言

Javaコードから呼び出すための関数宣言をします。

今回はcom.example.testパッケージにMySortクラスを作成しました。

packagecom.example.test;

publicclassMySort {
 publicstaticnativevoidNegativeSort(int[] ary,intlength);//int型配列の降順ソート
}

5. jniディレクトリとヘッダファイルを作成

javahを使ってヘッダファイルを自動生成します。

メソッドの宣言を自分で作るのは、命名規則が面倒だしおすすめしません。

プロジェクトのルートディレクトリで以下のコマンドを実行してください。

javah -classpath bin/classes -jni -d jni com.example.test.MySort

jniディレクトリの下にcom_example_test_MySort.hができます。

6..cppファイルに追加

ひな型で作成したcppファイルに、com_example_test_MySort.hの宣言をコピペして中身を実装します。

#include"com_example_test_MySort.h"
#include <algorithm>
#include <functional>
using namespace std;

JNIEXPORT void JNICALL Java_com_example_test_MySort_NegativeSort(JNIEnv *env,jclass cls,jintArray ary,jint length) {


jint*target = env->GetIntArrayElements(ary, NULL);
 sort(target, target + length, greater<int>());

 env->ReleaseIntArrayElements(ary, target, 0);

}

7.ビルドする

プロジェクトのルートディレクトリで以下のコマンドを実行してください。

ndk-build

ndk-buildNDK_DEBUG=1

とオプションをつけるとデバッグ可能になります。

ビルドが成功するとlibs/armeabi下にlibmysort.soファイルができるので確認してください。

8. ライブラリをロード

MySort.javaを以下のように変更します。

package com.example.test;

publicclass MySort {
static {
System.loadLibrary("mysort");
}

public static native int[] NegativeSort(int[] ary,int length);// int型配列の降順ソート
}

ここまででJNIライブラリを使う準備ができました。

9.ライブラリを使う

下のコードのように関数を使うことができます。

 int[] test = {23,4576,21,456,1};
 MySort.NegativeSort(test, test.length);
inti= test[0];
  • 実行する

Eclipseのデバッガで実行してみましょう。

しかし、ここで下のようなエラーがでるかもしれません。

f:id:sugar_affordance:20130306232302p:plain

その場合、下のリンクを参考に修正してみてください。

http://d.hatena.ne.jp/kimukou_26/20121117/1353110564


成功すると降順ソートされているのがわかります。

f:id:sugar_affordance:20130306232538p:plain

Androidでプリミティブ型の降順ソートしたかっただけなのに

完全にNDKのハウツーになってるし(-。-;)

ってか簡単に降順ソートする方法知ってる方おしえてください;;