AndroidNDKはじめました。そして終えました。

使うきっかけとしては、音のデータを扱う為でした。

音のデータをrawで扱うと48000hzとかだと、1秒間に48000の数値を取得する事になりまして、例えば、10秒くらい取得してしまうと480000くらいで、このあたいをごにょごにょと使って、フーリエ変換でもしようものなら、数百万回の繰り返しを行いたくなってしまい、10秒の音楽データを変換するのに20秒かかってしまい、アプリとしては破綻してしまっていたので、ちょっと方向転換を込めてNDKに手を出してみる事になりまいした。

他にもcのライブラリを使いたいとかで結構使えるみたいなので、おすすめなのかもしれません。

 本を買ったのですが、さっぱりでした。敷居の高さと使い方がわからなかったです。実践集みたいなポイントポイントで高速化の為のコード(コピペで使える)の本あったら買いたいですが、現状NDK関連の本は4冊ほどありましたが、ちょっと意味を理解できませんでしたorz….

とりあえず、下記でインストールができました。

tech booster

インストールまでばっちりです。

それで今回はpitch shiftですが、下記c++のソースが下記にあります。

dspdimension.com

pitch shiftを検索してるとここに行き当たる事が多いです。

このソースコードを使いたいのだけど、NDKはcとc++のどちらでも読み込めるのですが、情報が入り乱れています。

利用している技術としてはJNIという単語も必要ですが、割りと早い段階で挫折したくなります。

 

Android.mkというファイルをいじるのですが、解説を書いてくれる人、本があるのですが、理解できませんでした。

基本的には、無視です。デフォルト的な下記ですすめました

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := file
LOCAL_SRC_FILES := file.cpp

include $(BUILD_SHARED_LIBRARY)

file.cppの部分はc言語であればfile.cでしょうか、利用しているfile名に合わせて変更してください。

でfile.cppの部分は

#include <math.h>
#include <jni.h>
#include <string.h>
#include <stdio.h>

//smbPitchShift.cppのソースがここに入ります。

extern "C"
{
JNIEXPORT jfloatArray JNICALL Java_info_dorodoro_gr8_EffectVoice_bys2
(JNIEnv *env, jobject obj, jfloatArray fltarray1){
long len = env->GetArrayLength( fltarray1);
jfloat* flt1 = env->GetFloatArrayElements( fltarray1,0);
smbPitchShift(1.6, len,512, 6, 44100,flt1, flt1);
return fltarray1;

};
}

でpitcShiftのNDKが出来ました。

Java_info_dorodoro_gr8_EffectVoice_bys2はユーザーのファイル名とかに合わせます。

利用する際には

public native float[]  unimplementedbys2(float[] _byte);
public native float[]  bys2(float[] _byte);
static {
    System.loadLibrary("hello-jni");
}

で準備をてfloatの音の配列を

//voice::float[]
voice = bys2(voice);

で利用すると、ボイスチェンジャーが出来ました!!

と思い実行をすると、・・・・。遅い。Javaで実測16秒くらいだったのが、だいたい25秒程度かかります。

javaでやった方が早かった。。丸2日やって成果0。

 

 

題名にも書きましたが、しばらくは使わないかな。

 

前後の記事

前の記事:

次の記事:

関連の記事

コメントの投稿

  • サイト内検索

新作アプリの紹介

関連サイトの紹介

アンドロイドアプリ開発TIPS
きぐるみカメラ
ふらいぱん
アンドロイドのデザイン集
Page top↑