zoukankan      html  css  js  c++  java
  • AS下NDK开发(一)

    捣鼓了一天的NDK,总结下。

    Eclipse下开发ndk好像挺麻烦的样子,看书上要下载Cygwin,eclipse还要下载插件CDT。。而在AS上就方便多啦。下载android ndk。安装,配置环境,即可。

    NDK(android native develop kits ):android 本地开发工具集 ,这些工具帮助开发者快速开发C或C++动态库,并自动将so和java文件打包成apk,可以把c/c++ ->编译成一个 linux下可以执行的二进制文件 java代码里面就可以通过jni 调用执行二进制的文件.

    JNI :java本地开发接口,JNI是一个协议这个协议用来沟通java代码和外部的本地代码(c/c++).通过这个协议,java代码就可以调用外部的c/c++,代码外部的c/c++代码也可以调用java代码。

    JNI开发用途:Native code效率高,数学运算,实时渲染的游戏上,音视频处理(极品飞车,opengl,ffmpeg等。

    一、配置NDK环境

    下载NDK,网上有很多,下载好之后,解压即可。然后在AS中配置,依次点击:File ->ProjectStructure:如图:

    配置好之后,会在项目下的local.properties文件里自动添加:ndk.dir=D:\android-ndk-r10d   如果没有就自己加上,我的是自动的。

    二、建立app项目

      1.建立一个普通的android project

      2.声明原生方法,必须加上native,告诉程序这是一个原生方法。在具体java代码调用时,和调用java的其他方法一样,直接调用就可以了。activity代码:

    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Toast;
    
    public class NDK extends Activity {
    
        static {
            System.loadLibrary("MyJni");//导入生成的链接库文件
        }
        
        public native String getStringFromNative();//本地方法
        public native String getString_From_c();
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_ndk);
        }
    
        public void onClick(View view) {
            System.out.println(getString_From_c());
            Toast.makeText(this, getStringFromNative(), Toast.LENGTH_LONG).show();
        }
    }

    System.loadLibrary("MyJni");加载库,需要注意的是加载的库名即编译生成的库名,去掉前缀lib和后缀so。

    然后make project一下,目的就是编译成对应的class文件。然后根据生成的class文件,利用javah生成对应的 .h头文件。

    三、生成.h头文件

    1.AS中点击view ->ToolsWindows->Terminal,
    cd appsrcmain,进入srcmain目录下:
    2.执行:
    javah -d jni -classpath F:androidsdkplatformsandroid-23android.jar;....uildintermediatesclassesdebug example.user.ndkdemo2.NDK
    这个命令很长,分开慢慢来,javah是生成头文件需要的工具,-d jni 在工程下生成jni目录,到时会在这个目录下建JNI开始的C/C++源文件的。
    -classpath F:androidsdkplatformsandroid-23android.jar 这个就是你SDK文件下android.jar所在的文件位置,找到后复制即可。
    ....uildintermediatesclassesdebug 这个路径如图所示:

    example.user.ndkdemo2.NDK就是NDKclass的路径名。

    执行完这个命令后,会在main文件夹下自动生成jni目录和.h头文件。

    可以打头文件看看:

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class example_user_ndkdemo2_NDK */
    
    #ifndef _Included_example_user_ndkdemo2_NDK
    #define _Included_example_user_ndkdemo2_NDK
    #ifdef __cplusplus
    extern "C" {
    #endif
    #undef example_user_ndkdemo2_NDK_BIND_ABOVE_CLIENT
    #define example_user_ndkdemo2_NDK_BIND_ABOVE_CLIENT 8L
    #undef example_user_ndkdemo2_NDK_BIND_ADJUST_WITH_ACTIVITY
    #define example_user_ndkdemo2_NDK_BIND_ADJUST_WITH_ACTIVITY 128L
    #undef example_user_ndkdemo2_NDK_BIND_ALLOW_OOM_MANAGEMENT
    #define example_user_ndkdemo2_NDK_BIND_ALLOW_OOM_MANAGEMENT 16L
    #undef example_user_ndkdemo2_NDK_BIND_AUTO_CREATE
    #define example_user_ndkdemo2_NDK_BIND_AUTO_CREATE 1L
    #undef example_user_ndkdemo2_NDK_BIND_DEBUG_UNBIND
    #define example_user_ndkdemo2_NDK_BIND_DEBUG_UNBIND 2L
    #undef example_user_ndkdemo2_NDK_BIND_IMPORTANT
    #define example_user_ndkdemo2_NDK_BIND_IMPORTANT 64L
    #undef example_user_ndkdemo2_NDK_BIND_NOT_FOREGROUND
    #define example_user_ndkdemo2_NDK_BIND_NOT_FOREGROUND 4L
    #undef example_user_ndkdemo2_NDK_BIND_WAIVE_PRIORITY
    #define example_user_ndkdemo2_NDK_BIND_WAIVE_PRIORITY 32L
    #undef example_user_ndkdemo2_NDK_CONTEXT_IGNORE_SECURITY
    #define example_user_ndkdemo2_NDK_CONTEXT_IGNORE_SECURITY 2L
    #undef example_user_ndkdemo2_NDK_CONTEXT_INCLUDE_CODE
    #define example_user_ndkdemo2_NDK_CONTEXT_INCLUDE_CODE 1L
    #undef example_user_ndkdemo2_NDK_CONTEXT_RESTRICTED
    #define example_user_ndkdemo2_NDK_CONTEXT_RESTRICTED 4L
    #undef example_user_ndkdemo2_NDK_MODE_APPEND
    #define example_user_ndkdemo2_NDK_MODE_APPEND 32768L
    #undef example_user_ndkdemo2_NDK_MODE_ENABLE_WRITE_AHEAD_LOGGING
    #define example_user_ndkdemo2_NDK_MODE_ENABLE_WRITE_AHEAD_LOGGING 8L
    #undef example_user_ndkdemo2_NDK_MODE_MULTI_PROCESS
    #define example_user_ndkdemo2_NDK_MODE_MULTI_PROCESS 4L
    #undef example_user_ndkdemo2_NDK_MODE_PRIVATE
    #define example_user_ndkdemo2_NDK_MODE_PRIVATE 0L
    #undef example_user_ndkdemo2_NDK_MODE_WORLD_READABLE
    #define example_user_ndkdemo2_NDK_MODE_WORLD_READABLE 1L
    #undef example_user_ndkdemo2_NDK_MODE_WORLD_WRITEABLE
    #define example_user_ndkdemo2_NDK_MODE_WORLD_WRITEABLE 2L
    #undef example_user_ndkdemo2_NDK_DEFAULT_KEYS_DIALER
    #define example_user_ndkdemo2_NDK_DEFAULT_KEYS_DIALER 1L
    #undef example_user_ndkdemo2_NDK_DEFAULT_KEYS_DISABLE
    #define example_user_ndkdemo2_NDK_DEFAULT_KEYS_DISABLE 0L
    #undef example_user_ndkdemo2_NDK_DEFAULT_KEYS_SEARCH_GLOBAL
    #define example_user_ndkdemo2_NDK_DEFAULT_KEYS_SEARCH_GLOBAL 4L
    #undef example_user_ndkdemo2_NDK_DEFAULT_KEYS_SEARCH_LOCAL
    #define example_user_ndkdemo2_NDK_DEFAULT_KEYS_SEARCH_LOCAL 3L
    #undef example_user_ndkdemo2_NDK_DEFAULT_KEYS_SHORTCUT
    #define example_user_ndkdemo2_NDK_DEFAULT_KEYS_SHORTCUT 2L
    #undef example_user_ndkdemo2_NDK_RESULT_CANCELED
    #define example_user_ndkdemo2_NDK_RESULT_CANCELED 0L
    #undef example_user_ndkdemo2_NDK_RESULT_FIRST_USER
    #define example_user_ndkdemo2_NDK_RESULT_FIRST_USER 1L
    #undef example_user_ndkdemo2_NDK_RESULT_OK
    #define example_user_ndkdemo2_NDK_RESULT_OK -1L
    #undef example_user_ndkdemo2_NDK_MAX_NUM_PENDING_FRAGMENT_ACTIVITY_RESULTS
    #define example_user_ndkdemo2_NDK_MAX_NUM_PENDING_FRAGMENT_ACTIVITY_RESULTS 65534L
    #undef example_user_ndkdemo2_NDK_HONEYCOMB
    #define example_user_ndkdemo2_NDK_HONEYCOMB 11L
    #undef example_user_ndkdemo2_NDK_MSG_REALLY_STOPPED
    #define example_user_ndkdemo2_NDK_MSG_REALLY_STOPPED 1L
    #undef example_user_ndkdemo2_NDK_MSG_RESUME_PENDING
    #define example_user_ndkdemo2_NDK_MSG_RESUME_PENDING 2L
    /*
     * Class:     example_user_ndkdemo2_NDK
     * Method:    getStringFromNative
     * Signature: ()Ljava/lang/String;
     */
    JNIEXPORT jstring JNICALL Java_example_user_ndkdemo2_NDK_getStringFromNative
      (JNIEnv *, jobject);
    
    /*
     * Class:     example_user_ndkdemo2_NDK
     * Method:    getString_From_c
     * Signature: ()Ljava/lang/String;
     */
    JNIEXPORT jstring JNICALL Java_example_user_ndkdemo2_NDK_getString_1From_1c
      (JNIEnv *, jobject);
    
    #ifdef __cplusplus
    }
    #endif
    #endif

    这个文件中:JNIEXPORT jstring JNICALL Java_example_user_ndkdemo2_NDK_getStringFromNative(JNIEnv *, jobject);这是函数定义,Java_<packege_path>_<class_name>_<method_name>(JNIEnv *, jobject,<parameter_list>);

    函数定义中这两个参数:JNIEnv *, jobject是必须的,之后才是需要在函数调用时需要传递的参数,如:

    Java_<packege_path>_<class_name>_<method_name>(JNIEnv *, jint value1,jint value2);//jint是什么意思,在后边说明。jint就是代表的Java里的int类型。

    四,创建C文件,实现native方法

    在jni目录下建立c文件:util.c是一个空文件,这是因为NDK在windows系统上的一个bug,没有会出错,你也可以不建,如果出错再建也没事。

    c文件:

    #include "example_user_ndkdemo2_NDK.h"
    //#include <android/log.h>
    //#define  LOG_TAG  "System.out"
    //#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG,  __VA_ARGS__)
    //#define LOGINFO(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG,  __VA_ARGS__)
    
    
    JNIEXPORT jstring JNICALL Java_example_user_ndkdemo2_NDK_getStringFromNative
            (JNIEnv * env, jobject jobject){
       // LOGINFO("LOGINFO");
        return (*env)->NewStringUTF(env,"NDK 测试成功");
    }
    
    JNIEXPORT jstring JNICALL Java_example_user_ndkdemo2_NDK_getString_1From_1c
            (JNIEnv * env, jobject jobject){
    
        return  (*(*env)).NewStringUTF(env,"NDK 来自于C文件");
    
    }
    //
    // Created by user on 2016/4/13.
    //

    最后还有配置一个地方:build.gradle文件的defaultConfig中加ndk

    android.mk文件位置:

    五、jni.h文件

    在jni.h文件中,定义了本地的数据类型和对象的引用类型,编写c代码时要注意必须使用这些定义的数据类型和对象的引用类型

    对象数据:





  • 相关阅读:
    vps云服务器建站后绑定域名的方法?
    怎么做局域网远程联机?
    解决服务器Active&nbsp;Directory环境里Windows登录性能问题办法
    搭建dns域名服务器过程
    服务器电源常见故障判断及处理方法
    有些网站为什么要使用CDN,CDN又是什么呢
    独立服务器使用技巧介绍
    云服务器和虚拟主机的区别
    CDN在中国的发展的九个年头的点点滴滴
    网络安全的攻防战争
  • 原文地址:https://www.cnblogs.com/jycboy/p/5393727.html
Copyright © 2011-2022 走看看