美文网首页
NDK学习—JNI篇

NDK学习—JNI篇

作者: leap_ | 来源:发表于2020-03-03 20:24 被阅读0次

    前言

    2020 03 03 估计开学要到五月一号了 ,到今天,java和安卓的基础部分大概过了一遍了,还有动画,handler,性能三个点没有复习,估计这周可以完成,下面的两个核心内容就是framework和ndk,这两个内容之前看都没看过,估计有点难度,重点学习ndk吧,因为我不太喜欢去手机厂上班,我要去移动互联网公司 ,在ndk的过程中穿插着选几个framework看一看

    JNI静态注册

    1 在java类中声明一个native方法
    public class JniTest {
    
        public native String get();
        
        public static void main(String[] args) {
    
        }
    }
    
    2 通过javac 命令行编译.java生成.class字节码文件
    生成的字节码文件
    3 通过javah命令导出JNI头文件
    生成的JNI头文件

    这里有一个小的注意点,javah命令必须 要类的全类名,所以要退到上一个目录去javah整个类的全路径;


    JNI的.h头文件
    3 创建C项目,在makeList文件中导入JNI头文件,在makeList文件中导入JNI头文件
    在makeList文件中导入JNI头文件 在makeList文件中导入JNI头文件
    4 新建C文件,讲JNI头文件中的函数声明复制到C文件中,并且加入JNI头文件的include,重写这个函数
    新建的C文件 重写后的C文件
    5 build项目后会出现dll文件(Windows下,如果是Android 会是so文件)
    dll文件
    6 在java中应用这个dll库
    public class JniTest {
    
    
        static {
            System.load("C:\\Users\\leap\\CLionProjects\\untitled1\\cmake-build-debug\\libfirstLib.dll");
        }
    
        public native String get();
    
    
        public static void main(String[] args) {
            System.out.println(new JniTest().get());
        }
    
    }
    
    运行结果

    这里报错了是因为我Clion的MinGW的版本是32位的,所以不兼容导致的,而我又找不到新版的MInGW了,在官网下载不下来,这个32位的还是找的百度的

    所有资源(已下载安装,直接用):链接: https://pan.baidu.com/s/1TeUh-JV1WfCG7wc-zp0DqQ 提取码: 4m39

    JNI动态注册

    1 新建一个java类,声明一个native方法
    public class Dynamic {
    
        public native String getDynamic();
    
    }
    
    2 新建C文件,添加jni.h文件
    // 引入jni.h
    #include <jni.h>
    
    // 本地方法用于映射java的native方法
    jstring fun(JNIEnv *env,jobject obj){
        return "dynamic 123";
    }
    
    // java类的全名
    static const char* mClassName = "jni/Dynamic";
    
    // java 类中的方法用结构体数组表示 三个变量分别是(类名称,类签名,映射方法的指针)
    static const JNINativeMethod mMethods[] = {
            {"getDynamic","()Ljava/lang/String", (void *)fun},
    };
    
    //  jni.h中实现的方法,用于关联映射关系,
    JNIEXPORT jint JNICALL
    JNI_OnLoad(JavaVM *vm, void *reserved){
    
        JNIEnv* env = NULL;
        //获得 JniEnv
        int r = (*vm)->GetEnv(vm,(void**) &env, JNI_VERSION_1_4);
        if( r != JNI_OK){
            return -1;
        }
        jclass mainActivityCls = (*env)->FindClass( env,mClassName);
        // 注册 如果小于0则注册失败
        r = (*env)->RegisterNatives(env,mainActivityCls,mMethods,1);
        if(r != JNI_OK ) {
            return -1;
        }
        return JNI_VERSION_1_4;
    }
    

    java方法签名查看:



    首先javac生成字节码 ,在javap字节码

    3 在makeList中build后拿到dll文件,在java class 中load出来(同静态注册)

    相关文章

      网友评论

          本文标题:NDK学习—JNI篇

          本文链接:https://www.haomeiwen.com/subject/mgvnkhtx.html