分享好友 行情首页 行情分类 切换频道
C++库封装JNI接口——实现java调用c++
2024-12-20 07:09  浏览:80
  • Java客户代码实现和native方法声明属于java层,使用java编译器编译;
  • JNI接口实现代码和c++库属于c++层,使用G++编译。

这里假定C++类库已经预编译好了,有现成的so库和c接口使用。首先明确一点就是,我们要为C++库封装一个java接口,也即在java层使用C++库暴露的所有函数,那么:

  1. 第一步就是创建一个java类,并按照c++库的接口函数声明,创建所有的native本地接口函数声明(可以是static的)。
  2. 第二步,将这些本地接口声明映射为C++ JNI接口声明,这一步是通过java提供的工具按照既定的映射机制自动生成。这也就保证了java层能正确找到c++实现。
  3. 第三步,实现第二步自动生成的c++ JNI接口函数,在这些接口实现中,按照需要调用c++类库的接口函数,以使用特定的功能并拿到需要的结果。所以,这里要注意的一点是,c++ JNI接口函数实现会编译为一个单独的动态库,并且该动态库动态链接C++类动态库。(这里没有尝试过静态库,按道理应该也是可以的)。此外,在c++ JNI函数实现中按照类型签名规则,我们可以获取到从java层传入的参数,也可以返回特定的数据到Java层。
  4. 第四步,在java应用层使用加载第三步编译生成的jni so库,即可间接调用到c++库函数。

PS:

  1. String 字符串函数操作


  • JNI 支持将 jstring 转换成 UTF 编码和 Unicode 编码两种。因为 Java 默认使用 Unicode 编码,而 C/C++ 默认使用 UTF 编码。所以使用将 jstring 转换成 UTF 编码的字符串。其中,jstring 类型参数就是我们需要转换的字符串,而 isCopy 参数的值在实际开发中,直接填 0或NULL就好了,表示深拷贝。

  • 当调用完 方法时别忘了做完全检查。因为 JVM 需要为产生的新字符串分配内存空间,如果分配失败就会返回 NULL,并且会抛出 OutOfMemoryError 异常,所以要对 GetStringUTFChars 结果进行判断。

  • 当使用完 UTF 编码的字符串时,还不能忘了释放所申请的内存空间。调用 方法进行释放。

  • 除了将 jstring 转换为 C 风格字符串,JNI 还提供了将 C 风格字符串转换为 jstring 类型。

  • 通过函数可以将 UTF 编码的 C 风格字符串转换为 jstring 类型,通过函数可以将 Unicode 编码的 C 风格字符串转换为 jstring 类型。这个 jstring 类型会自动转换成 Java 支持的 Unicode 编码格式。

  • C++库封装JNI接口——实现java调用c++

实践出真知,分别建立一个c++工程和java工程,源码github地址。
结构目录如下:


整体构建流程如下:

  1. 在java工程下创建和C++类库同名(非必须)的java类源文件,并声明和c++工程接口统一的native成员函数;
    使用命令生成naive本地接口.h头文件。将其拷贝到c++工程下。
  2. 在c++工程下实现jni接口头文件中的函数声明,实现中调用c接口间接完成特定能力调用,编译为libjnilib.so,并链接原始c++库的动态库。
  3. 回到java工程中,在native接口所在的那个类中,添加jni库加载代码:

  1. java 测试代码调用,使用如下脚本:
    以上就是本篇文章【C++库封装JNI接口——实现java调用c++】的全部内容了,欢迎阅览 ! 文章地址:http://w.yusign.com/quote/1990.html 
     行业      资讯      企业新闻      行情      企业黄页      同类资讯      网站地图      返回首页 述古往 http://w.yusign.com/mobile/ , 查看更多   
最新新闻
手机备忘录恢复(手机备忘录恢复软件)
  关于手机备忘录恢复的探讨  随着科技的发展,手机已成为我们日常生活中不可或缺的一部分。手机的备忘录功能因其便捷性受到
申请苹果手机id账号(申请iphone id帐号)
  申请苹果手机ID账号的详细步骤与注意事项  随着科技的发展,苹果产品已成为许多人日常生活中的必需品。在使用苹果手机的过
中兴手机论坛(中兴手机论坛社区)
  中兴手机论坛:探讨技术前沿,共享用户心得  随着科技的飞速发展,智能手机已经成为我们日常生活中不可或缺的一部分。作为
idm手机(IDM手机破解版)
  《idm手机:智能时代的全新体验》  随着科技的飞速发展,智能手机已经成为了我们日常生活中不可或缺的一部分。在众多手机
光圈最大的手机(光圈最大的手机排名)
  关于《光圈最大的手机》的文章  随着科技的不断发展,手机摄影已经成为人们生活中不可或缺的一部分。在众多手机品牌和型号
动态动漫手机壁纸(动态动漫手机壁纸免费下载)
  动态动漫手机壁纸:科技与美学的完美结合  随着科技的快速发展,智能手机已经成为我们日常生活中不可或缺的一部分。人们追
0pp0手机价格(0pp0手机价格表实体店)
  OPPO手机价格分析  OPPO手机以其出色的外观设计、强大的拍照功能和良好的用户体验赢得了广大消费者的喜爱。本文将为您简要
华为手机锁屏设置(华为手机锁屏设置在哪里)
  华为手机锁屏设置详解  随着科技的进步,智能手机已成为我们日常生活中不可或缺的一部分。华为手机,以其高质量和强大的功
vivo手机忘记解锁密码怎么办(vivo手机忘记解锁密码怎么办还不丢失数据)
  《vivo手机忘记解锁密码怎么办》  随着智能手机的普及,vivo手机因其出色的性能和优雅的设计赢得了广大用户的喜爱。然而,
华为手机时间设置在哪(华为手机时间设置在哪里 24小时)
  华为手机时间设置在哪  华为手机作为国产手机品牌的佼佼者,其操作系统功能丰富,使用便捷。对于许多用户来说,时间设置是
本企业新闻
推荐企业新闻
发表评论
0评