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)测试略

posted on 2015-09-16 12:29  鸿钧老祖  阅读(176)  评论(0编辑  收藏  举报

导航