AndroidStudio3.0中JNI开发

版权声明:1.版权归原作者Moment ° 回忆 ✨所有; 2.未经原作者允许不得转载本文内容,否则将视为侵权; 3.转载或者引用本文内容请注明来源及原作者; 4.对于不遵守此声明或者其他违法使用本文内容者,本人依法保留追究权等。 https://blog.csdn.net/qq_35366269/article/details/83718560

1.什么是JNI?

   JNI 是java native interface  的缩写,如果想实现JAVA调用C、C++ ,那么就需要利用JNI来实现,JNI可以使java和c、c++ 相互调用, JNI可以看做是翻译,其实就是一套协议。

2.为什么要用JNI?

          驱动程序一般都是用C写的,如果JAVA想操作硬件那么就需要去跟C去交互,如果想利用android 软件来控制硬件,比如在手机中点击一个按钮就可以控制电灯的开启和关闭,比如点击手机中的按钮就可以控制小区门禁的开启和关闭 ,比如如果想实现人脸识别的功能,就可以利用java来调用jni,然后通过jni来调用OpenCV实现人脸识别的功能.

3.怎么使用JNI?

要用JNI,首先要学c、c++的基础
NDK 是native develop kit的缩写,     DNK是谷歌在Androud下给开发JNI的一套工具

3.0 给当前的项目添加NDK支持

 3.1、声明一个本地函数:

  /**
     * JNI开发的步骤
     * 1、声明本地方法,使用native关键字,该本地方法不用实现
     * @return
     */
    public native String helloFromC();

3.2、在项目的main文件夹下创建jni文件下,比创建一个.c文件

3.3、创建一个本地函数,比实现该函数

/*
创建本地函数
在C中用jstring来表示JAVA中的String
C本地函数的命名规则为:

Java_调用C本地函数的的使用者包名_使用者类名_调用本地函数的函数名(JNIEnv* env,jobject thiz)
Java_com_casic_jni_MainActivity_helloFromC(JNIEnv* env,jobiect thiz)


JNIEnv* env 是一个指针, 它是结构体JNINativeInterface 的二级指针
JNIEna 是结构体JNINativeInterface的一级指针
实现将 JNIEnv* env转换成JNINativeInterface的一级指针: (*env)
->是C中的间接运算符


jobiect 即相当于JAVA中的object  ,它是调用本地函数的java对象,当前的thiz就是MainActivity这个对象


(JNIEnv* env,jobiect thiz) 这两个参数是固定的,就算调用C的本地函数时不用传递任何参数,那么这两个参数也是必须要有有的。如果需要传递参数,那么在后面添加即可
*/
jstring Java_com_casic_jnitestthree_MainActivity_helloFromC(JNIEnv* env,jobject thiz){

    /*
    实现当调用本地函数时返回一个字符串回去
    */
    char* str = "hello from c!";
    //通过jni.h中的NewStringUTF(env,cstr) 函数实现将char*数据类型转换为jstring数据类型
     return (*env)->NewStringUTF(env,str);
}

3.4、在jni目录下创建一个Android.mk文件,并在其中加入如下代码:

LOCAL_PATH := $(call my-dir)

    include $(CLEAR_VARS)

    LOCAL_MODULE    := hello
    LOCAL_SRC_FILES := hello.c

    include $(BUILD_SHARED_LIBRARY)

3.5、进入到该项目的根目录下,通过ndk-nuild命令对其c文件进行编译,如果编译成功就会在生成如下文件

3.6、在main目录下创建一个jniLibs的文件下,并将libs文件下的所有文件都拷贝到该目录中

3.7、加载so文件

   System.loadLibrary("hello");

3.8、调用最开始声明的本地函数

             /*
                * 6、调用本地函数
                * */
                String s = helloFromC();
                Toast.makeText(getApplicationContext(),s,Toast.LENGTH_SHORT).show();

3.9、在gradle.properties文件中的默认添加如下代码:

Android.useDeprecatedNdk=true 

3.10、在app的build.gradle文件中添加如下代码:

        ndk{
            moduleName "hello"
        }

        sourceSets.main{
            jniLibs.srcDirs = ['src/main/jniLibs'];
        }
        sourceSets {
            main {
                jni.srcDirs = []
            }
        }

效果图:

源码下载 

猜你喜欢

转载自blog.csdn.net/qq_35366269/article/details/83718560