NDK学习—JNI篇

2020-03-03  本文已影响0人  leap_

前言

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出来(同静态注册)
上一篇下一篇

猜你喜欢

热点阅读