2.7 JNI应用层实例分析
2.2 节讲解了JNI在应用框架层的使用,那么应用层又是如何使用JNI的呢?本节将通过一个实例来演示在应用层如何配合NDK开发基于JNI的应用程序。
NDK给基于JNI的应用开发带来了极大的便利。只需要以下三步:
步骤1 在Eclipse中建立Android工程,并在项目根目录建立jni目录,然后在jni目录加入JNI层的实现代码和对应的Android.mk文件。
步骤2 将项目复制到NDK samples目录,运行ndk-build命令。NDK会自动编译出共享库,并置于armeabi目录下。
步骤3 将新生成的目录和文件从NDK中复制回Eclipse。工程目录如图2-4所示。
图 2-4 应用层JNI工程目录
接下来将分步实现应用层JNI。
2.7.1 Java层分析
在Eclipse中建立Android工程,工程名为AppJni,并生成一个启动Activity:AppJniActivity。内容如下:
package com.allongriver.jni;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class AppJniActivity extends Activity{
private static final String TAG="AppJniActivity";
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.d(TAG, show());
}
//声明一个Native方法,需要在JNI中实现
private native String show();
/*JNI中需要调用callback方法,用来演示在JNI中如何操作Java类。为了
*演示JNI函数调用过程中如何捕获Java异常,我们故意在callback函数
中抛出NullPointerException,而且没有捕获这个异常/
private void callback(){
Log.d(TAG,"call back from native");
throw new NullPointerException();
}
/*在静态代码库中加载libapp_jni.so共享库,这个库在安装
*该应用程序的时候,由PackageManager从apk中解压输出到
/data/data/om.allongriver.jni/lib/libapp_jni.so/
static{
System.loadLibrary("app_jni");//不需要带共享库的前缀lib和后缀so
}
}
以上代码实现在Java层中对Native方法show()的调用,并在调用过程中,由JNI函数回调Java层callback方法。