zoukankan      html  css  js  c++  java
  • 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)测试略

  • 相关阅读:
    SpringBoot2.x 工作流开源项目
    Nginx:终于有人把 Nginx 说清楚了,图文详解!
    MySQL8配置修改:Mysql group by this is incompatible with sql_mode=only_full_group_by
    解决错误:java.sql.SQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections"
    工作时使用的vim配置
    工作笔记整理
    Linux mint启用内核转储
    usleep和sleep
    gdb使用
    掩码配置为255.255.255.255
  • 原文地址:https://www.cnblogs.com/hebao0514/p/4812948.html
Copyright © 2011-2022 走看看