当前位置:   article > 正文

Android JNI机制_android jni通信

android jni

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();
    }
 
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

(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
  • 1
  • 2
  • 3
  • 4
  • 5

(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
  • 1
  • 2
  • 3
  • 4

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

这个头文件中便告诉了我们需要用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");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

添加头文件:

需求:C程序中包含的 jni.h文件需要从Linux系统安装的JDK目录下复制过来;

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数嵌入式工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

img

img

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以+V:Vip1104z获取!!! (备注:嵌入式)

img

最后

资料整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~

你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!

/img-community.csdnimg.cn/images/73bb5de17851459088c6af944156ee24.jpg" alt=“img” style=“zoom: 67%;” />

最后

资料整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~

你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!

更多资料点击此处获qu!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/575225
推荐阅读
相关标签
  

闽ICP备14008679号