JNI开发步骤:
1.写java声明方法
public class MyJni {
public native int add (int a, int b);
public native int sub (int a, int b);
public native String helleFromC();
}
2.用javah命令生成C语言头文件
到工程的bin目录下面
cd work\adt-bundle-windows-x86-20140321\eclipse\workspace\AndroidDemo\bin
javah -d header -classpath classes -jni com.example.androiddemo.jni.MyJni
生成的头文件就在bin\header文件夹中
参数说明:
-d header 表示将在当前目录下生成一个header文件夹,产生的头文件就在这里面了;
-classpath classes 指明类所在的位置
-jni com.example.androiddemo.jni.MyJni 指定类名
然后在android工程中创建一个jni目录,将生成的头文件放到jni目录中。3.实现头文件的方法
编写一个.c文件,实现头文件。
#include <stdio.h>
#include <jni.h>
#include "com_example_androiddemo_jni_MyJni.h"
JNIEXPORT jstring JNICALL Java_com_example_androiddemo_jni_MyJni_helleFromC
(JNIEnv * env, jobject obj){
return (*env)->NewStringUTF(env, "hello from c");
}
JNIEXPORT jint JNICALL Java_com_example_androiddemo_jni_MyJni_add
(JNIEnv * env, jobject obj, jint a , jint b){
return a + b;
}
4.编写Android.mk文件,生成.so文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE :=Operator
LOCAL_SRC_FILES :=Operator.c
#liblog.so libGLESv2.so
LOCAL_LDLIBS += -llog
include $(BUILD_SHARED_LIBRARY)
说明:LOCAL_SRC_FILES :=Operator.c,就是编写的c文件
LOCAL_MODULE :=Operator,就是去掉c文件的后缀名之后的名字
cd /cygdrive/e/work/adt-bundle-windows-x86-20140321/eclipse/workspace/AndroidDemo
在cgwin中使用命令$NDK/ndk-build
$NDK是我定义的ndk的路径
生成的.so文件就在工程的libs目录下面
5.调用.so文件中的方法
static{
System.loadLibrary("Operator");
}
<pre name="code" class="java"> case R.id.btn:
//<span style="white-space:pre"> </span>Toast.makeText(this, new MyJni().helleFromC(), 0).show();
<span style="white-space:pre"> </span>Toast.makeText(this, new MyJni().add(1, 2) + "", 0).show();
<span style="white-space:pre"> </span>break;