写完了 c 文件和 Makefile 文件,是否可以编译了呢?我们试一下。在 cygwin 中,进入工程目录,运行 ndk-build ,得到下面的结果:
Administrator@lenovo-0e47e162 /Android/android-ndk-r4/samples/myndk
$ ndk-build
Android NDK: Could not find application's manifest from current directory.
Android NDK: Please ensure that you are inside the project's directory !
/android/android-ndk-r4/build/core/build-local.mk:74: *** Android NDK: Aborting
. Stop.
看到这个错误的意思是,缺少 manifest 文件。老版本的 NDk ,工程中有一个 apps ,里面包含了应用的程序文件和 Application.mk 。现在的版本,不需要我们自己编写 Application.mk, ,不过仍需要工程相关的配置信息。那么如何做到呢?需要手工去写 manifest 文件么?不需要。我们只需要在 Eclipse 中,创建工程就可以了,这些配置文件会自动生成。
前面讲过,在工程的 src 夹子下用来放置 Java 文件。我们打开 Eclipse ,然后新建一个 Android 工程,工程名就叫 MyJNI ,工程路径选择我们创建的 NDK 的路径。这里需要注意的是,工程名,包名等,需要和上面的 c 文件中的保持一致。
(Java _com_jpf_myjni _MyJNI _stringFromJNI)
工程建立好后,编辑 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 动态库的。上面声明的方法,具体实现,就在我们加载的库中。