Android_Jni学习总结
Android中jni的实现方法
1.编写我们的android的java源码
(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里面刷新一下,发现,出现了obj和libs两个文件夹,里面都包含了我们需要的.so文件。
7.在eclipse里面运行查看结果