下载Android安安软件请到:http://code.google.com/p/andbox

JNI是Java Native Interface的缩写,译为Java本地接口。它允许Java代码和其他语言编写的代码进行交互。在android中提供JNI的方式,让Java程序可以调用C语言程序。android中很多Java类都具有native接口,这些接口由本地实现,然后注册到系统中。

主要的JNI代码放在以下的路径中:frameworks/base/core/jni/,这个路径中的内容被编译成库libandroid_runtime.so,这是个普通的动态库,被放置在目标系统的/system/lib目录下。此外,android还有其他的JNI库。JNI中的各个文件,实际上就是普通的C++源文件;在android中实现的JNI库,需要连接动态库libnativehelper.so。

1,JNI的实现方式

实现JNI需要在Java源代码中声明,在C++代码中实现JNI的各种方法,并把这些方法注册到系统中。实现JNI的核心是JNINativeMethod结构体。

typedef struct {
const char* name;
const char* signature;
void* fnPtr;
} JNINativeMethod;

第一个变量name是Java中JNI函数的名字,第二个变量signature用字符串描述函数参数和返回值,第三个变量fnPtr是JNI函数C指针。

在Java代码中,定义的函数由JNI实现时,需要指定函数为native。

2,在应用程序中使用JNI,可以通过代码中/development/samples/SimpleJNI来分析:

A,分析顶层Android.mk文件

LOCAL_PACKAGE_NAME := SimpleJNI //生成PACKAGE的名字,在out\target\product\smdk6410\obj\APPS

LOCAL_JNI_SHARED_LIBRARIES := libsimplejni //生成JNI共享库的名字,在....smdk6410\obj\SHARED_LIBRARIES

include $(BUILD_PACKAGE) //以生成APK的方式编译

include $(call all-makefiles-under,$(LOCAL_PATH)) //调用下层makefile

B,分析JNI目录下Android.mk文件

LOCAL_SRC_FILES:= \ //JNI的C++源文件
native.cpp

include $(BUILD_SHARED_LIBRARY) //以共享库方式编译

3,JNI的代码实现和调用

A,native.cpp内容

static jint add(JNIEnv *env, jobject thiz, jint a, jint b){} //定义JAVA方法add

static const char *classPathName = "com/example/android/simplejni/Native"; //目标JAVA类路径

static JNINativeMethod methods[] = { //本地实现方法列表
{"add", "(II)I", (void*)add },
};

static int registerNativeMethods(JNIEnv* env, const char* className,
JNINativeMethod* gMethods, int numMethods){} //为调用的某个JAVA类注册本地JNI函数

static int registerNatives(JNIEnv* env){} //为当前平台注册所有类及JNI函数

jint JNI_OnLoad(JavaVM* vm, void* reserved) //为当前虚拟机平台注册本地JNI

以上三个从下到上依次调用

B,SimpleJNI.java内容

package com.example.android.simplejni; //JAVA包,跟文件路径对应

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView; //需要包含的类,以便调用函数

public class SimpleJNI extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
int sum = Native.add(2, 3); //调用Native类的函数add,该add就是JNI函数,由CPP实现
tv.setText("2 + 3 = " + Integer.toString(sum));
setContentView(tv); //在屏幕上显示
}
}

class Native {
static {
// The runtime will add "lib" on the front and ".o" on the end of
// the name supplied to loadLibrary.
System.loadLibrary("simplejni"); //载入由native.cpp生成的动态库,全名是lib+simplejni+.o
}

static native int add(int a, int b); //声明动态库中实现的JNI函数add,供JAVA调用
}

编译生成PACKAGE后,安装到MID上,运行即是2+3=5。

转自:http://wallage.blog.163.com/blog/static/17389624201032141818282/

更多相关文章

  1. C语言函数以及函数的使用
  2. Android程序实现全屏代码
  3. Android调用系统自带的文件管理器进行文件选择并获得路径,android
  4. [原]Android有用代码片断(六)
  5. android shape 代码实现按钮背景
  6. 获取Android SDK 源代码并在Eclipse中关联查看的方法(for sdk2.3
  7. Android开发实例源代码批量下载
  8. Android实现游戏摇杆的源代码

随机推荐

  1. Android(安卓)Stagefright MPEG4Extracto
  2. Android(安卓)简单的网络变化监听器
  3. Android(安卓)Studio多个Module依赖同一
  4. android通过号码查询联系人姓名
  5. Android(安卓)Fastboot源码分析
  6. Android(安卓)手机相机自动对焦
  7. textview之url
  8. Android中从服务器端向客户端传数据
  9. android 实现一直震动和间歇震动
  10. Android(安卓)Q自定义开关机动画