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();
    }
 
}

(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年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

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!!

  • 20
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android JNI学习路线可以按照以下步骤进行: 1. 了解JNI的基本概念和作用:JNI(Java Native Interface)是Java提供的一种机制,用于实现Java与其他编程语言(如C、C++)之间的交互。它允许在Java代码中调用本地代码(Native Code),并且可以在本地代码中调用Java代码。 2. 学习JNI的基本语法和规则:JNI使用一组特定的函数和数据类型来实现Java与本地代码之间的交互。你需要学习如何声明本地方法、如何在Java代码中调用本地方法、如何在本地代码中调用Java方法等。 3. 学习JNI的数据类型映射:JNI提供了一套数据类型映射规则,用于将Java数据类型映射到本地代码中的数据类型。你需要学习如何处理基本数据类型、对象类型、数组类型等。 4. 学习JNI的异常处理:在JNI中,Java代码和本地代码之间的异常处理是非常重要的。你需要学习如何在本地代码中抛出异常、如何在Java代码中捕获异常等。 5. 学习JNI的线程处理:JNI允许在本地代码中创建和操作线程。你需要学习如何创建和销毁线程、如何在线程之间进行通信等。 6. 学习JNI的性能优化:JNI涉及到Java代码和本地代码之间的频繁切换,因此性能优化是非常重要的。你需要学习如何减少JNI调用的次数、如何避免不必要的数据拷贝等。 7. 学习JNI的调试和测试:在开发JNI程序时,调试和测试是非常重要的。你需要学习如何使用调试器调试本地代码、如何进行单元测试等。 8. 学习JNI的进阶主题:一旦掌握了基本的JNI知识,你可以进一步学习JNI的进阶主题,如JNI与Java虚拟机的交互、JNI与动态链接库的交互、JNI与多线程的交互等。 总结起来,Android JNI学习路线包括了基本概念、基本语法、数据类型映射、异常处理、线程处理、性能优化、调试和测试以及进阶主题等内容。通过系统地学习这些知识,你将能够更好地理解和应用JNI技术。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值