• JNI 使用案例详解(一)


      很久没有写博客了,今天来写一下关于在android开发过程中使用JNI的详细案例及操作步骤。

    首先,JNI,我的理解,他就是java和C之间的桥梁,很多写C++和JAVA的人不会写JNI,因为这两个方向的人,正常情况下都不会去用JNI来做什么,只有一些功能需要在C层来完成,而java层只是用来调用C层实现的代码逻辑的时候,就需要使用JNI来完成这部分工作了。

    第一,首先我们说C层的实现:

    首先,C++ 我们创建文件时,会生成两个文件,例如,我们命名为:TestCommitDemo.cpp,一个是.h文件,一个是.cpp 文件,这两个文件,一个是用来声明的,一个是用来实现的。我们在cpp内写了一个TestCommit()方法,需要java在适当的时机,来调用这个testCommit方法。那这时,我们就需要使用JNI文件来把这个方法转给java来实现了。

    JNI文件同样的,创建的时候也是两个文件.h和.cpp 文件。例如,我们创建了两个文件,JNITest.cpp和JNITest.h 两个文件

    1. JNITest.h
    2. class JNITest {
    3. };
    4. JNITest.cpp
    5. #include "JNITest.h"

    以上就是创建完成之后两个文件的内容。

    然后,我们就开始把TestCommit()方法传递出去。首先,我们得知道,我们需要在哪里调用这个TestCommit方法。比如我们需要在TestActivity类中,调用这个方法。

    那在JNITest.h 中可以声明这个方法

    1. JNIEXPORT void JNICALL Java_com_test_code_TestActivity_TestCommit(
    2. JNIEnv *env, jobject obj);

    说明一下方法名和参数,JNIEXPORT 和JNICALL都是固定的,void表明这个方法不需要有返回值,若有返回值,可参考一下 几种类型,jint,jstring....之类的。

    其次,Java_com_test_code_TestActivity_TestCommit 为JNI的方法名com_test_code_TestActivity

    com_test_code 为你的包名,TestActivity 为你要调用c++中的方法名的类名。TestCommit 为方法的名称。至此,JNITest.h 中就可以完成了。剩下的就是JNITest.cpp 中如何实现这个方法了。
     

    1. JNIEXPORT void JNICALL Java_com_test_code_TestActivity_TestCommit(
    2. JNIEnv *env, jobject obj){
    3. TestCommitDemo testCommitDemo;
    4. testCommitDemo.testCommit();
    5. }

     如上,我们创建了TestCommitDemo,用此对象来调用testCommit()方法。注意,.h 和 .cpp 内的两个方法名必须一模一样。至此,我们完成了JNI层和C层的全部代码。下面,我们就完成Java层的部署

    1.因为我们项目中含有c文件,所以,不论我们是使用mk文件也好,使用cmake文件也好,总之, 都需要把c的代码进行编译,那编译的c模块的名称即 LOCAL_MODULE ,

    System.loadLibrary("LOCAL_MODULE名称");

    至此,我们就可以和我们的c部分绑定到一起了。

    2.我们把JNI中相同的名称写入到java文件中,例如:private native void testCommit();

    注意,一定要有native,这样才能调到JNI中声明的方法。

    3.在适当的时机,即需要调用此方法的地方,java中调用即可实现。

    over

  • 相关阅读:
    【01】Spring源码-手写篇-手写IoC实现
    Linux防火墙(iptables)
    什么是内存泄漏?JavaScript 垃圾回收机制原理及方式有哪些?哪些操作会造成内存泄漏?
    黄金眼PAAS化数据服务DIFF测试工具的建设实践
    Bankless:4种可以让你在以太坊合并中获益的方式
    k8s pod控制器详解
    ChatGLM2-6B模型尝鲜
    MySQL学习day01
    解决访问出现404和500的问题(Tomcat与Servlet、JSP、JDK的版本适配问题)
    GZ035 5G组网与运维赛题第10套
  • 原文地址:https://blog.csdn.net/u011228868/article/details/126786294