• 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

  • 相关阅读:
    Qt Creator 编译 libxlsxwriter
    PM2管理器无法使用解决方法
    MySQL数据库JDBC编程
    数据结构---HashMap和HashSet
    2023年北京市安全员-C3证证模拟考试题库及北京市安全员-C3证理论考试试题
    web学习---JavaScript---笔记(三)
    [附源码]java毕业设计st音乐网站论文
    JSP工作原理
    python之函数的用法
    【3D视觉】深度摄像头与3D重建
  • 原文地址:https://blog.csdn.net/u011228868/article/details/126786294