Android的JNI实现基础

                                                                                                                 Android_Jni学习总结

Androidjni的实现方法

1.编写我们的androidjava源码

1)创建一个android工程

2)加载动态链接库

3)申明native方法

代码如下:

package explorer.jniTest01;

import android.app.Activity;

import android.os.Bundle;

import android.widget.TextView;

public class JniTest01extends Activity {

/*加载动态链接库*/

static {

System.loadLibrary("hello");

}

/*申明natvie方法*/

public native int add(int a,int b);

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

TextView textView = (TextView)findViewById(R.id.add);

/*验证native方法*/

textView.setText("add ="+add(3,6));

}

}

2.eclipse中编译我们的android工程

3.调用javah这个工具生成explorer_jniTest01_JniTest01.h文件

1)首先进入到工程的bin文件目录

2)执行javah工具(包含在工程文件下创建jni文件目录)

代码如下:

cd /root/Desktop/android_jni/jniTest01/bin

javah -d /root/Desktop/android_jni/jniTest01/jni/ -classpath . explorer.jniTest01.JniTest01

这里说明一下-classpath后面的.前后都有空格,.后面的文件格式为包名.类名

我们还是先看看这个.h文件的内容吧

代码如下:

/* DO NOT EDIT THIS FILE - it is machine generated */

#include<jni.h>

/* Header for class explorer_jniTest01_JniTest01 */

#ifndef _Included_explorer_jniTest01_JniTest01

#define _Included_explorer_jniTest01_JniTest01

#ifdef __cplusplus

extern"C" {

#endif

/*

* Class: explorer_jniTest01_JniTest01

* Method: add

* Signature: (II)I

*/

JNIEXPORT jint JNICALLJava_explorer_jniTest01_JniTest01_add

(JNIEnv *, jclass, jint, jint);

#ifdef __cplusplus

}

#endif

#endif

这里不在解释了,在JAVA_JNI中以讲解过

4更具explorer_jniTest01_JniTest01.h文件编写.c文件

1)加载需要的头文件

2)实现native方法

代码如下:

#include<jni.h>

#include"explorer_jniTest01_JniTest01.h"

JNIEXPORT jint

JNICALL Java_explorer_jniTest01_JniTest01_add(JNIEnv *env, jclass c, jint a, jint b)

{

return (a+b);

}

5.创建一个Android.mk的工程管理文件

代码如下:

LOCAL_PATH:= $(call my-dir)

include$(CLEAR_VARS)

LOCAL_SRC_FILES:= hello.c

LOCAL_SHARED_LIBRARIES := libutils

LOCAL_MODULE := libhello

include$(BUILD_SHARED_LIBRARY)

好吧这里以此来说下他们有什么用吧

LOCAL_PATH:= $(call my-dir)表示在开发树中查找源文件,这里的宏函数my-dir由编译系统提供,返回当前路径

include$(CLEAR_VARS)这里的 CLEAR_VARS由编译系统提供,表示清除LOCAL_XX变量(除了LOCAL_PATH

LOCAL_SRC_FILES:= hello.c这里我们需要修改成我们自己的.c文件

LOCAL_SHARED_LIBRARIES := libutils表示生成的库共享库即动态链接库

LOCAL_MODULE := libhello表示我们生成的库名为libhello.os

include$(BUILD_SHARED_LIBRARY)表示生成的库共享库即动态链接库

6.使用NDK工具生成.so文件

1)到工程目录下

2)使用ndk-build

代码如下:

cd /root/Desktop/android_jni/jniTest01

ndk-build

这时我们在eclipse里面刷新一下,发现,出现了objlibs两个文件夹,里面都包含了我们需要的.so文件。

7.eclipse里面运行查看结果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章