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


          作为一个AndoirdJava程序猿,会受到Java语言的局限。由于作为一面门向对象的语言不能像C/C++那样轻易调用与硬件有关的操作。因此JNI就搭建了这样一个桥梁,使JavaC/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:cygwin64android-ndk-r8c dk-build

           c/c++ General/Paths and Symbols/GNU C add D:cygwin64android-ndk-r8cplatformsandroid-14arch-armusrinclude

                   假设还在报一些编译环境的错误。把project转移到D:cygwin64android-ndk-r8csamples基本就能够通过,这里我也不是非常清楚是为什么,预计是路径映射的问题,哪位大神知道,能够分享下。


                    

      

  • 相关阅读:
    [转] torch损失函数
    [转] EM算法
    [转] 先验概率and后验概率
    [转] 协方差矩阵
    系统安全管理
    deeplearing4j学习以及踩过的坑
    ES 应用
    springboot使用多数据源以及配置
    SparkStreaming+Kafa+HBase
    使用IDEA2017在Windows下编程并测试Hadoop2.7+Spark2.2+Azkaban
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7265380.html
Copyright © 2020-2023  润新知