戻る>2006
「SDK でプログラミング」を拡張する.
ライブラリをリビルドしたら,eclipse側で「Refresh(F5)」を実行する必要がありそう.
New -> Folder で,HelloActivity 直下に,jni フォルダを作成する.
android-ndk-r4b\samples\hello-jni\jni\ の,Android.mk をjni以下にコピー.
android-ndk-r4b\samples\hello-jni\jni\ の,hello-jni.c をjni以下に,sum-jni.cとしてコピー.
Android.mk を以下のように修正.
LOCAL_LDLIBS の行は,__android_log_print()を使うのに必要.
sum-jni.c を以下のように修正.
関数名(この場合は,Java_com_example_android_helloactivity_HelloActivity_sumFromJNI)は非常に重要なので要注意.
__android_log_print()を使うには,#include <android/log.h> も必要.
cygwin を起動してから,jni以下に移動して ~/android-ndk-r4b/ndk-build を実行.
execute ボタンが押された時の処理に,native実行を追加.
JNI呼出のおまじないを追加.
Android.mkを修正.
sum-jni.c を修正.
__android_log_print の出力結果が不正なのは何故だろうか?
sum-func.c を作成.
「SDK でプログラミング」を拡張する.
ライブラリをリビルドしたら,eclipse側で「Refresh(F5)」を実行する必要がありそう.
New -> Folder で,HelloActivity 直下に,jni フォルダを作成する.
android-ndk-r4b\samples\hello-jni\jni\ の,Android.mk をjni以下にコピー.
android-ndk-r4b\samples\hello-jni\jni\ の,hello-jni.c をjni以下に,sum-jni.cとしてコピー.
Android.mk を以下のように修正.
LOCAL_LDLIBS の行は,__android_log_print()を使うのに必要.
# Copyright (C) 2009 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_LDLIBS := -llog LOCAL_MODULE := sum-jni LOCAL_SRC_FILES := sum-jni.c include $(BUILD_SHARED_LIBRARY)
sum-jni.c を以下のように修正.
関数名(この場合は,Java_com_example_android_helloactivity_HelloActivity_sumFromJNI)は非常に重要なので要注意.
__android_log_print()を使うには,#include <android/log.h> も必要.
/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ /* #include <string.h> /* */ #include <jni.h> #include <android/log.h> /* This is a trivial JNI example where we use a native method * to return a new VM String. See the corresponding Java source * file located at: * * apps/samples/hello-jni/project/src/com/example/HelloJni/HelloJni.java */ jlong Java_com_example_android_helloactivity_HelloActivity_sumFromJNI (JNIEnv* env, jobject thiz, jint endNum) { jlong sum = 0; int i; for(i = 1;i<=endNum;i++){ sum += i; } __android_log_print(ANDROID_LOG_INFO,"SUM","sum= %ld \n",sum); return (sum); }
cygwin を起動してから,jni以下に移動して ~/android-ndk-r4b/ndk-build を実行.
$ ~/android-ndk-r4b/ndk-build Compile thumb : sum-jni <= /cygdrive/e/Development/android-sdk-windows/platforms/android-4/samples/HelloActivity/jni/sum-jni.c SharedLibrary : libsum-jni.so Install : libsum-jni.so => /cygdrive/e/Development/android-sdk-windows/platforms/android-4/samples/HelloActivity/libs/armeabi
execute ボタンが押された時の処理に,native実行を追加.
if(arg0==execButton){ /* execute ボタンが押されたときの処理 */ { // native 実行 String strSum=""; // 開始時間取得 long sUpTimeMillis = SystemClock.uptimeMillis(); long sum=0; sum = sumFromJNI(Integer.valueOf(strEnd)); strSum = String.valueOf(sum); // 文字列へ変換 // 終了時間取得 long eUpTimeMillis = SystemClock.uptimeMillis(); /* 計算結果表示 */ View txtResult = this.findViewById(R.id.TextView04); ((TextView)txtResult).setText(strSum); /* 計算時間表示 */ View elpTime = this.findViewById(R.id.TextView05); ((TextView)elpTime).setText("Native : " + String.valueOf(eUpTimeMillis - sUpTimeMillis) + " ms"); } { // Java 実行 String strSum="";
JNI呼出のおまじないを追加.
public native long sumFromJNI(int nNumber); public native long unimplementedSumFromJNI(int nNumber); static { System.loadLibrary("sum-jni"); }
Android.mkを修正.
LOCAL_SRC_FILES := sum-jni.c sum-func.c
sum-jni.c を修正.
__android_log_print の出力結果が不正なのは何故だろうか?
#include <pthread.h> void func1( jint ); void func2( jint ); extern jlong sum_func1, sum_func2; jlong Java_com_example_android_helloactivity_HelloActivity_sumFromJNI ( JNIEnv* env, jobject thiz, jint endNum) { pthread_t t1 ; pthread_t t2 ; pthread_create( &t1, NULL, (void *)func1, (void *)endNum ); pthread_create( &t2, NULL, (void *)func2, (void *)endNum ); pthread_join( t1, NULL ); pthread_join( t2, NULL ); __android_log_print(ANDROID_LOG_INFO,"SUM","sum_func1 = %d",sum_func1); __android_log_print(ANDROID_LOG_INFO,"SUM","sum_func2 = %d",sum_func2); return (sum_func1 + sum_func2); }
sum-func.c を作成.
/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ /* #include <string.h> /* */ #include <jni.h> #include <android/log.h> #include <pthread.h> /* This is a trivial JNI example where we use a native method * to return a new VM String. See the corresponding Java source * file located at: * * apps/samples/hello-jni/project/src/com/example/HelloJni/HelloJni.java */ jlong sum_func1=0, sum_func2=0; jlong common_func(jint x){ int i; jlong sum=0; for(i = 1;i<=x;i++){ sum += i; } return sum; } void func1( jint x ) { sum_func1 = common_func(x); __android_log_print(ANDROID_LOG_INFO,"SUM","func1 %d %d\n",x, sum_func1); } void func2( jint x ) { sum_func2 = common_func(x); __android_log_print(ANDROID_LOG_INFO,"SUM","func2 %d %d\n",x, sum_func2); }
コメントをかく