工程建立好后,编辑 src/com/jpf/myjni/MyJNI.java 文件,内容如下:
package com.jpf.myjni;
import android.app.Activity;
import android.widget.TextView;
import android.os.Bundle;
public class MyJNI extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
TextView tv = new TextView( this );
tv.setText( stringFromJNI() );
System. out .println( "Here we go ..." );
setContentView(tv);
System. out .println( "Done!" );
}
public native String stringFromJNI();
static {
System.loadLibrary ( "myjni" );
}
}
需要说明的几点:
public native String stringFromJNI(); 这句申明,带有 native 关键字,说明该方法是本地方法。
System.loadLibrary ( "myjni" ); 这句就是用来加载我们的 c 动态库的。上面声明的方法,具体实现,就在我们加载的库中。
建立好工程,再次编译,在 cygwin 中运行 ndk-build ,结果 OK 。
Administrator@lenovo-0e47e162 /android/android-ndk-r4/samples/myndk
$ ndk-build
Compile thumb : myjni <= /android/android-ndk-r4/samples/myndk/jni/myjni.c
SharedLibrary : libmyjni.so
Install : libmyjni.so => /android/android-ndk-r4/samples/myndk/libs/armea
bi
我们看到,需要的共享库已经生成,并且安装好了。下面就可以生成 apk 了。
在 Cygwin 中进行工程的 build ,编译后,在工程的 bin 目录下,会看到我们的 apk 包。
好,我们试试看,能否正常运行。在 Eclipse 选择执行方式为 Android Application ,点击 run ,以下 console 的输出:
[2010-07-07 14:26:18 - MyJNI] ------------------------------
[2010-07-07 14:26:18 - MyJNI] Android Launch!
[2010-07-07 14:26:18 - MyJNI] adb is running normally.
[2010-07-07 14:26:18 - MyJNI] Performing com.jpf.myjni.MyJNI activity launch
[2010-07-07 14:26:18 - MyJNI] Automatic Target Mode: using existing emulator 'emulator-5554' running compatible AVD 'android21'
[2010-07-07 14:26:18 - MyJNI] WARNING: Application does not specify an API level requirement!
[2010-07-07 14:26:18 - MyJNI] Device API version is 7 (Android 2.1-update1)
[2010-07-07 14:26:18 - MyJNI] Uploading MyJNI.apk onto device 'emulator-5554'
[2010-07-07 14:26:18 - MyJNI] Installing MyJNI.apk...
[2010-07-07 14:26:24 - MyJNI] Success!
[2010-07-07 14:26:25 - MyJNI] Starting activity com.jpf.myjni.MyJNI on device
[2010-07-07 14:26:29 - MyJNI] ActivityManager: Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.jpf.myjni/.MyJNI }
上面的 warning ,是我们没有指定 API 的版本号。如下指定一下就没有这个 warning 了。
下图为执行的效果:
下图是我们查看 LogCat 的输出:
可以看到我们的输出 MYJNI : MyJNI is called !