赞
踩
3.JNI方法注册
JNI方法注册在JNI开发过程中起到什么样的作用?
先来简单说一下java加载本地so库的过程:
(1)在java类中加载本地.so库文件,并声明native方法;
(2)在C代码中实现so库中对应的方法;
(3)在java层需要调用native方法的地方进行调用;
这里有个问题:java层调用的native方法是怎样和Native层实现的方法对应起来的?这就需要通过一种机制建立它们之间的对应关系,这种机制就是JNI方法注册机制。
JNI方法注册分为静态注册和动态注册,其中静态注册多用于NDK开发,而动态注册多用于Framework开发。本文主要讲解静态注册。
**静态注册:**根据函数名来建立java方法和JNI函数间的一一对应关系,多用于NDK开发。
(1)编写java代码:
首先,先创建一个文件夹JNI,用来存放接下来所有的文件;
cd JNI进入文件夹JNI,创建com文件夹,进入com文件夹,创建test文件夹;
package com.test;
public class JNIDemo {
//定义一个方法,该方法在C中实现
public native void testHello();
public static void main(String[] args){
//加载C文件
System.loadLibrary("TestJNI");
JNIDemo jniDemo = new JNIDemo();
jniDemo.testHello();
}
}
(2)回到JNI文件夹,使用命令javac com/test/JNIDemo.java编译java文件生成JNIDemo.class(回到JNI文件夹的原因:编译时要有完整的包名,在java程序文件所在目录下编译会报错)
user@user-PC:~/Desktop/JNI/com/test$ cd ../../
user@user-PC:~/Desktop/JNI$ javac com/test/JNIDemo.java
user@user-PC:~/Desktop/JNI$ cd com/test/
user@user-PC:~/Desktop/JNI/com/test$ ls
JNIDemo.class JNIDemo.javaDemo
(3)生成头文件
回到JNI目录,输入命令:javah -classpath . -jni com.test.JNIDemo,可以看到在JNI目录下生成了
一个名为com_test_JNIDemo.h的头文件(注:“.” 表示将生成的头文件保存在当前目录);
user@user-PC:~/Desktop/JNI/com/test$ cd ../../
user@user-PC:~/Desktop/JNI$ javah -classpath . -jni com.test.JNIDemo
user@user-PC:~/Desktop/JNI$ ls
com com_test_JNIDemo.h TestJNI.c
com_test_JNIDemo.h文件内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_test_JNIDemo */ #ifndef _Included_com_test_JNIDemo #define _Included_com_test_JNIDemo #ifdef __cplusplus extern "C" { #endif /* * Class: com_test_JNIDemo * Method: testHello * Signature: ()V */ JNIEXPORT void JNICALL Java_com_test_JNIDemo_testHello (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
这个头文件中便告诉了我们需要用C/C++实现的函数的原型,即
JNIEXPORT void JNICALL Java_HelloWorld_print ( JNIEnv * env, jobject obj)
函数名格式:Java_类名_函数名
参数env代表java虚拟机环境,Java传过来的参数和c有很大的不同,需要调用JVM提供的接
口来转换成C类型的,就是通过调用env方法来完成转换的。
参数obj代表调用的对象,相当于c++的this。当c函数需要改变调用对象成员变量时,可以通
过操作这个对象来完成。
(4)编写C/C++代码
回到JNI目录,编写C程序,代码如下:
注:其中的头文件jni.h在后面会添加,com_test_JNIDemo.h文件前面已经生成;
//TestJNI.c
#include "jni.h"
#include "stdio.h"
#include "com_test_JNIDemo.h"
JNIEXPORT void JNICALL Java_com_test_JNIDemo_testHello
(JNIEnv *env, jobject obj) {
printf("Hello World\n");
}
添加头文件:
需求:C程序中包含的 jni.h文件需要从Linux系统安装的JDK目录下复制过来;
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数嵌入式工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以+V:Vip1104z获取!!! (备注:嵌入式)
资料整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~
你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!
/img-community.csdnimg.cn/images/73bb5de17851459088c6af944156ee24.jpg" alt=“img” style=“zoom: 67%;” />
资料整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~
你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。