Android(java)学习笔记203:JNI之NDK开发步骤
1. NDK开发步骤(回忆一下HelloWorld案例):
(1)创建工程
(2)定义native方法
(3)创建jni文件夹
(4)创建c源文件放到jni文件夹
(5)拷贝jni.h头文件到jni目录下(jni.h头文件在ndk目录\platforms\android-14\arch-arm\usr\include)
(6)在c源文件中导入jni头文件
(7)在c源文件中按照jni协议规范生成对应的native方法
返回类型 Java_packagename_className_methodName(JNIEnv* env, jobject obj,……)
(8)叫C代码工程师写好C的实现代码
(9)在C源文件中调用
(10)创建Android.mk文件,放到jni目录下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := .so文件名
LOCAL_SRC_FILES := .c源文件名
include $(BUILD_SHARED_LIBRARY)
(11)进入工程的根目录下,调用ndk-build命令,生成.os文件
(12)在java代码中,加载.os文件:
static {
System.loadLibrary(".so文件名");
}
(13)调用native方法
(14)测试运行
总而言之,JNI开发流程可以概括为下面的步骤:
(1) 在java中声明native方法
(2)编译java源文件得到class文件,然后通过javah命令导出JNI头文件
(3)实现jni方法(java中native声明的方法),使用C、C++实现
(4)编译成so库并在java中调用
2.下面根据上面的步骤,利用一个加法案例(请大家按照上面步骤):
(1)工程结构如下:
(2)代码内容
MainActivity,如下:
1 package com.himi.add; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.widget.Toast; 6 7 8 public class MainActivity extends Activity { 9 10 /** 11 * 12 * @param a 第一个加数 13 * @param b 第二个加数 14 * @return 结果a+b 15 */ 16 public native int add(int a, int b); 17 static { 18 System.loadLibrary("myadd"); 19 } 20 @Override 21 protected void onCreate(Bundle savedInstanceState) { 22 super.onCreate(savedInstanceState); 23 setContentView(R.layout.activity_main); 24 Toast.makeText(this, "res of add(5,8):"+add(5,8), 0).show(); 25 } 26 27 28 }
Android.mk,如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := myadd
LOCAL_SRC_FILES := add.c
include $(BUILD_SHARED_LIBRARY)
add.c,如下:
1 #include <jni.h> 2 3 int add(int a, int b) { 4 return a+b; 5 } 6 7 8 jint Java_com_himi_add_MainActivity_add(JNIEnv* env, jobject obj, jint a, jint b) 9 { 10 return add(a,b); 11 }
还有就是导入的jni.h文件
libmyadd.so是利用NDK生成的linux库文件
(3)测试略