• Android(java)学习笔记203:JNI之NDK开发步骤


    1. NDK开发步骤(回忆一下HelloWorld案例):

    (1)创建工程

    (2)定义native方法

    (3)创建jni文件夹

    (4)创建c源文件放到jni文件夹

    (5)拷贝jni.h头文件到jni目录下(jni.h头文件在ndk目录platformsandroid-14arch-armusrinclude)

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

  • 相关阅读:
    【校招面试 之 C/C++】第23题 C++ STL(五)之Set
    Cannot create an instance of OLE DB provider “OraOLEDB.Oracle” for linked server "xxxxxxx".
    Redhat Linux安装JDK 1.7
    ORA-10635: Invalid segment or tablespace type
    Symantec Backup Exec 2012 Agent for Linux 卸载
    Symantec Backup Exec 2012 Agent For Linux安装
    You must use the Role Management Tool to install or configure Microsoft .NET Framework 3.5 SP1
    YourSQLDba介绍
    PL/SQL重新编译包无反应
    MS SQL 监控数据/日志文件增长
  • 原文地址:https://www.cnblogs.com/hebao0514/p/4812948.html
Copyright © 2020-2023  润新知