Android高级NDK/JNI编程技术基础介绍

【Android高级NDK/JNI编程技术基础介绍】别裁伪体亲风雅,转益多师是汝师。这篇文章主要讲述Android高级NDK/JNI编程技术基础介绍相关的知识,希望能为你提供帮助。
      作为一个Andoird的java程序猿,会受到Java语言的局限。由于作为一面门向对象的语言不能像C/C+ + 那样轻易调用与硬件有关的操作。因此JNI就搭建了这样一个桥梁,使Java和C/C+ + 语言之间能够互相调用。
作为一个Javaproject师对C/C+ + 的语言不是非常熟悉,但仅仅需熟悉他们之间调用的原理和方法,关于C/C+ + 的编程就交给C语言project师去吧。
          在这篇文章中主要介绍NDK/JIN搭建和基本用法。

一、  环境的搭建


二、 主要的使用

      步骤:
          (1)新建androidproject
          (2)在java中声明native方法
          (3)在project中新建jni目录(使用javah   test 生成头文件,编写C代码)
          (4)编写Android.mk文件(是一个配置文件告诉NDK怎样编译C代码)
               

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE:= test-jni LOCAL_SRC_FILES := test-jni.c LOCAL_LDLIBS+=-llog include $(BUILD_SHARED_LIBRARY)



          (5)运行" ndk-build" 生成动态库(在eclipse使用run也能够生成动态库)
          (6)java代码" load" 动态库,调用动态库

        1、java调用C
                      java 调用native method(Class param)
                      在c中会调用的方法中參数(JNIEnv*,Jobject,Jint...)
        2、c调用java
        先用java调用c。c然后回调

JNIEXPORT void JNICALL Java_com_ndk2_test_ProvideBean_callHi(JNIEnv *env, jobject obj) { char*classname = " com/ndk2/test/ProvideBean" ; jclass clazz; clazz = (*env)-> FindClass(env, classname); if (clazz == 0) { LOGI(" can not find class" ); } else { LOGI(" find the class" ); } jmethodID mid = (*env)-> GetMethodID(env, clazz, " showHi" , " ()V" ); if (mid == 0) { LOGI(" can not find method" ); } else { LOGI(" find method" ); } (*env)-> CallVoidMethod(env, obj, mid); } JNIEXPORT void JNICALL Java_com_ndk2_test_ProvideBean_calladd(JNIEnv *env, jobject obj) { char*classname = " com/ndk2/test/ProvideBean" ; jclass clazz; clazz = (*env)-> FindClass(env, classname); if (clazz == 0) { LOGI(" can not find class" ); } else { LOGI(" find the class" ); } jmethodID mid = (*env)-> GetMethodID(env, clazz, " showAdd" , " (II)V" ); if (mid == 0) { LOGI(" can not find method" ); } else { LOGI(" find method" ); } (*env)-> CallVoidMethod(env, obj, mid, 6, 7); }

运行项目之前还要配置环境:
        c/c+ + Bulid Build command:   bash D:\cygwin64\android-ndk-r8c\ndk-build
        c/c+ + General/Paths and Symbols/GNU C add  D:\cygwin64\android-ndk-r8c\platforms\android-14\arch-arm\usr\include
                假设还在报一些编译环境的错误。把project转移到D:\cygwin64\android-ndk-r8c\samples基本就能够通过,这里我也不是非常清楚是为什么,预计是路径映射的问题,哪位大神知道,能够分享下。

                 
   






    推荐阅读