zoukankan      html  css  js  c++  java
  • android NDK 笔记

    *************************************************华丽的分割线**************************************************************
    NDK 开发步骤
    1.创建一个项目
    2.创建JNI目录
    3.编写nativejava层方法
    4.生成JNI头文件
    (1)编写javaNative代码
    (2)介绍一个命令javah
    (3)添加android.jar包到环境变量


    声明一个native方法

    创建JNI目录

    控制台进入当前项目目录

    输入命令
    E:android workspaceHelloNDK_1>javah -classpath bin/classes;D:androidandroid_
    sdk_windowsplatformsandroid-19android.jar -d jni com.example.hellondk_1.MainA
    ctivity
    生成JNI头文件(其中,D:androidandroid_sdk_windowsplatformsandroid-19android.jar,
    是android sdk目录下的目录文件,为了简单,可以把android.jar文件目录添加到path路径下;
    最后com.example.hellondk_1.MainActivity是包名加类名)

    刷新项目可以看到jni目录下多了一个.h文件

    创建一个.c文件导入相应的头文件
    (
    如:创建一个hello.c文件
    #include<stdio.h>
    #include<stdlib.h>
    #include"com_example_hellondk_1_MainActivity.h"

    JNIEXPORT jstring JNICALL Java_com_example_hellondk_11_MainActivity_getStringFromC
    (JNIEnv *env, jclass jclass){

    return (*env)->NewStringUTF(env, "Hello from C !....");
    }
    其中实现了头文件中的方法Java_com_example_hellondk_11_MainActivity_getStringFromC(JNIEnv *, jclass);
    )

    在jni目录下添加mk文件。(这个可以导入ndk的实例下面的mk文件然后做修改就可以了)如下
    LOCAL_PATH := $(call my-dir)

    include $(CLEAR_VARS)

    LOCAL_MODULE := hello
    LOCAL_SRC_FILES := hello.c

    include $(BUILD_SHARED_LIBRARY)
    其中,
    LOCAL_MODULE 表示编译生成的so叫什么名字
    LOCAL_SRC_FILES 表示要编译的.c文件是哪个

    最后在项目路径下执行ndk-build命令。
    执行完之后对项目进行刷新可以看到项目下面多了一个obj目录里面多了一个.so文件。
    然后在java文件中添加静态代码块。添加.so文件。

    最后运行代码就可以看到结果了。
    *************************************************华丽的分割线**************************************************************
    JNIEnv* env表示当前线程的环境
    jobject thiz表示当前的实例
    jint si 表示一个int类型的变量
    jfieldID fid表示一个字段或者java某一个属性。
    jclass cls表示一个类或实例
    jmethodID mid表示某个类里面的某个方法的id

    cls=(*env)->GetObjectClass(env,thiz);
    mid=(*env)->GetStaticMethodID(env,cls,"callback","()V")//第三个参数表示一个静态方法名

    fid=(*env)->GetStaticFieldID(env,cls,"si","I");//后面两个表示变量名和数据类型

    si=(*env)->GetStaticIntFieldId(env,cls,fid);//取得fid这个字段里面的si数据赋值给si


    LOCAL_LDLIBS+=-llog//在mk文件中添加日志库

    #include<android/long.h>//在c文件中添加这个头文件加入android开发的log
    _android_log_print(ANDROID_LOG_INFO,"stringFromJNI()","xxx");//打印信息
    _android_log_print(ANDROID_LOG_INFO,"stringFromJNI()","var=",var);//打印变量信息

    java---->jni----->c/c++数据转换顺序

    JNI数组处理

    很多方法可以在D:androidandroid-ndk-r9cplatformsandroid-16arch-armusrincludeh=jni.h头文件里面查看还有官方文档

    *************************************************华丽的分割线**************************************************************
    Eclipse配置ndk开发(参考视频教程:http://www.imooc.com/video/8028)
    一、在Eclipse中选择ndk目录(Window--->Preferences--->Android---->NDK---->在NDK Location中选择ndk的目录位置)

    二、配置生成javah选项
    选择External Tools(运行按钮旁边的那个里面)----->选择Program右键new----->输入Name(如generate_c++_header_file)
    ----->在Main标签页下选择Variables(选择System_path然后加冒号:添加javah)------>然后选择Working Directory
    添加Variables(选择project_loc然后添加jni例如"${project_loc}jni")------>然后添加Arguments参数
    (-classpath ${project_loc}inclasses;D:androidandroid_sdk_windowsplatformsandroid-19android.jar -d
    ${project_loc}jni -jni ${java_type_name})其中$xxx可以在Eclipse里面选择。----->最后run出现eclipse出现的
    错误不要管。
    使用即在项目下面新建一个jni目录。然后在java文件里面添加native方法,然后选中这个java文件,然后选择运行按钮
    旁边的绿色按钮选择我们配置好的generate_c++_header_file点击运行,然后刷新一下就可以看到jni目录下面生成了.h文件
    (注意:工作目录最好不要带空格否则会出现一些错误)。


    三、配置eclipse添加native支持jni方法代码提示
    在工作目录右键选择android Tools--->add native support
    选择项目右键选择properties---->C++General--->Path and Symbols--->Includes下add---->File System
    (选择ndk所在目录下的include:例如"D:androidandroid-ndk-r9cplatformsandroid-19arch-armusrinclude")
    然后单击应用,然后项目下面就多了一个Includes文件夹
    然后就可以在编写jni代码的时候按住ctrl+alt或alt+/得到代码提示

    四、配置生成javap选项
    类似配置javah,
    Location为${system_path:javap}
    Working Directory为${project_loc}
    Arguments为-classpath ${project_loc}inclasses -s -p ${java_type_name}

    还可以配置ndk-build命令

    *************************************************华丽的分割线**************************************************************
    JNI数据类型讲解
    (
    参考官网:http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/types.html#wp428
    或者博客:http://blog.csdn.net/conowen/article/details/7523145
    )
    *************************************************华丽的分割线**************************************************************

  • 相关阅读:
    1015: [JSOI2008]星球大战starwar
    Tyvj P1813 [JSOI2008]海战训练
    1012: [JSOI2008]最大数maxnumber
    1430: 小猴打架
    1270: [BeijingWc2008]雷涛的小猫
    1202: [HNOI2005]狡猾的商人
    1059: [ZJOI2007]矩阵游戏
    3039: 玉蟾宫
    1303: [CQOI2009]中位数图
    1002: [FJOI2007]轮状病毒
  • 原文地址:https://www.cnblogs.com/BasilLee/p/4816143.html
Copyright © 2011-2022 走看看