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.7 JNI应用层实例分析 - 图1

图 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方法。