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字节码