• Android学习笔记_JNI hello world


    1、需要准备的工具,eclipse,cdt(c++)插件,cygwin(unix)和 android ndk.

      在cygwin的etc目录下将ndk的路径引入到profile文件中,可以在cygwin的任何目录都可以访问到ndk,不同的ndk路径PATH的写法不同.

      : ${ORIGINAL_PATH=${PATH}}
      if [ ${CYGWIN_NOWINPATH-addwinpath} = "addwinpath" ] ; then
        PATH="/usr/local/bin:/cygdrive/d/cgwin/android-ndk-r7b:/usr/bin${PATH:+:${PATH}}"
      else
        PATH="/usr/local/bin:/usr/bin:/cygdrive/d/cgwin/android-ndk-r7b"
      fi

    2、开发步骤:

    a.创建一个android工程
    b.JAVA代码中写声明 native 方法 public native String helloFromJNI(); 通过javah  包名.类名生成jni的方法签名
    c. 创建jni目录,编写c代码,方法名字要对应。或者将生成的签名文件拷贝到jni目录,然后在c代码中引入。
    d.编写Android.mk文件
    e.Ndk编译生成动态库( ndk -build )
    f.Java代码load 动态库.调用native代码

      2.1 创建一个Android项目,创建native方法.

    public class MainActivity extends Activity {
        static{
            //加载二进制文件
            System.loadLibrary("Hello");//libHello.so 去掉lib和so
        } 
        public native String helloFormC();
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            System.out.println("------------"+helloFormC());
        }
    
    }

      2.2 javah命令成功签名:进入到项目的bin/classes命令下,执行命令 javah com.example.jni.MainActivity,将生成的头文件拷贝到jni目录下,在c文件中引入头文件 #include "com_example_jni_MainActivity.h" 。下面是javah命令的参数 和 生产头文件方式。

      2.3 创建C文件  

    #include <stdio.h>
    #include <jni.h>
    #include <malloc.h>
    #include "com_example_jni_MainActivity.h";
    
    JNIEXPORT jstring JNICALL Java_com_example_jni_MainActivity_helloFormC
      (JNIEnv * env, jobject obj){
    
        return (*env)->NewStringUTF(env,"hello from c ... ");
    }

       2.4 通过cygwin编译c文件,进入到项目目录,我的项目名称是jni,进入之后执行“ndk-build”命令,出现如下图所示表示执行成功。

      2.5 创建Android.mk文件,需要将hello-jni替换成自己的c文件模块名称,在ndk中的位置 file:///D:/cgwin/android-ndk-r7b/docs/ANDROID-MK.html:

    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE    := Hello
    LOCAL_SRC_FILES := Hello.c
    include $(BUILD_SHARED_LIBRARY)

         2.6 在android项目中的java文件引入编译生成的二进制文件。

    static{
            //加载二进制文件
            System.loadLibrary("Hello");//libHello.so 去掉lib和so
    }

      2.7 最后部署项目,运行就可以看到调用成功。

    ----------------------------------------

    待整理

    Android.mk文件增加LOCAL_LDLIBS += -llog

    C代码中增加

    #include <android/log.h>

    #define LOG_TAG "System.out"

    #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)

    #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

     LOGI("info ");

     LOGD("debug ");

    jstringJava_cn_itcast_ndk_DemoActivity_helloFromJNI(JNIEnv *env, jobjectjavaThis) {

      return (*env)->NewStringUTF(env, "Hello from native code!");

    }

    JNIEnv类型代表了java环境 通过JNIEnv* 指针,就可以对java端的代码进行操作.

    创建java类的对象,调用java对象的方法

    获取java对象的属性 等等.

    jobject是个什么

    jobjectobj就是当前方法所在的类代表的对象.

  • 相关阅读:
    HDU_oj_2048 错排问题
    HDU_oj_2047 阿牛的EOF牛肉面
    HDU_oj_2046 骨牌铺方格
    HDU_oj_2045 不容易系列之RPG问题
    拷贝构造函数(三)——重载赋值运算符
    拷贝构造函数(二)——深拷贝与浅拷贝
    拷贝构造函数(一)——哲学三连
    HDU_oj_2044 一只小蜜蜂
    【转发】【linux】【ftp】CentOS 7.0安装配置Vsftp服务器
    【编码】【转发】enca 转换编码
  • 原文地址:https://www.cnblogs.com/lbangel/p/3761953.html
Copyright © 2020-2023  润新知