在Intellij IEDA 做 java和 c/c++混编_aiyan4899的博客-程序员秘密

技术标签: java  开发工具  c/c++  

最近公司项目做语音录音,涉及导c++和java混合开发。研究了几天混编知识,这里总结下,记录下自己的劳动成果。

1. 什么是JNI?

  JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支持就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的。例如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少要保证本地代码能工作在任何Java 虚拟机环境。

 

2. 开始demo

-JniTest
    -src
        -main
            -java
                -com
                    -jni
                        -test

  

1)新建JniTest.java, 注意包路径 这里是 com.jni.test

package com.jni.test;

public class JNITest {
    //定义一个本地方法
    public native int sayHello();
}

2) 编译JniTest.java,生成JniTest.class文件

javac JniTest.java

3) 生成JniTest.h c/c++ 头文件,注意com.jni.test.JniTest不带任何后缀

cd 到 包的跟目录 这里是src/main/java
javah com.jni.test.JniTest

JniTest.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_jni_test_JniTest */

#ifndef _Included_com_jni_test_JniTest
#define _Included_com_jni_test_JniTest
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:    com_jni_test_JniTest
 * Method:    sayHello
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_com_jni_test_JniTest_sayHello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

  

4)新建JniTest.cpp 文件

/* DO NOT EDIT THIS FILE - it is machine generated */
#include "com_jni_test_JniTest.h"
#include <string.h>
/* Header for class NativeMethodTest */

#ifndef _Included_JniTest
#define _Included_JniTest
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     NativeMethodTest
 * Method:    intMethod
 * Signature: (I)I
 */
JNIEXPORT int JNICALL Java_com_jni_test_JniTest_sayHello
  (JNIEnv *, jobject){
      return 123456;
  }

5) 生成动态连接库,MAC:.jnilib  Linux: .so  注意linux系统 生成的链接库必须以lib开头,如libJniTest.so/ libJniTest.jnilib

MAC

gcc -I  /System/Library/Frameworks/JavaVM.framework/Headers -c JniTest.cpp

就可以得到一个编译好的文件JniTest.o,下面需要把.o文件打包成动态库。 

gcc -dynamiclib -o libJniTest.jnilib  JniTest.o

得到动态链接库 libJniTest.jnilib

Linux:

待更新

6)编写测试代码,Jnimaintest.java

static{
    System.loadLibrary("JniTest");
}

public static void main(String[] args){
    JniTest jniTest = new JniTest();
    System.out.println("========== Say hallow! start ==========");
    System.out.println(jniTest.sayHello());
    System.out.println("========== Say hallow! end ==========");
}

运行测试类: 遇到

java no XXX in java.library.path

可以run =》Edit configurations 配置,路径换成你自己的 链接库所在的位置

 

 如果要运行在tomcat容器中,需要把链接库放到tomcat目录下面的bin目录下即可

大功告成,get 混编技能!

 

posted on 2017-01-17 14:20  LZLY_MAN 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/Lzly/p/6292506.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/aiyan4899/article/details/102102265

智能推荐

【数据结构】算法3.3 迷宫求解_Zelda256的博客-程序员秘密

#include<stdio.h>#include<string.h>#include<stdlib.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2#define STACK_INIT_SIZE 100 //存储空间初始分配量#de

Android 数据库知识回顾_斌林诚上的博客-程序员秘密

一、前言二、效果预览​三、数据库与框架的基础使用(1)第一道:原生数据库(2)第二道:LitePal框架(3)第三道:GreenDao框架四、总结五、Demo地址六、内容推荐一、前言1.菜鸟作者为什么要写这篇呢?——随GitHub上Android数据库框架日新月异,我们应该如何选择一个适合我们的数据库。当然一个好的数据库框架不仅可以提高我们...

RGB转换HSL,HSV及切割车牌_永远爱mai的博客-程序员秘密

目录HSL和HSV简介对比RGB与HSL HSV相互转换RGB-&gt;HSL HSVHSL-&gt;RGBHSV-&gt;RGB一、图片颜色转换1.转换为灰度图2.转化为HSV HSL二、车牌切割1.读取2.灰度化和二值化3.闭运算4.腐蚀(去掉螺丝孔带来的影响)5.切割保存链接HSL和HSV简介HSL和HSV都是一种将RGB色彩模型中的点在圆柱坐标系中的表示法。这两种表示法试图做到比基于笛卡尔坐标系的几何结构RGB更加直观。HSL(HSI)即色相、饱和度、亮度(英语:Hue, Saturatio

TiDB 整体架构_tidb架构_袁番番的博客-程序员秘密

TiDB 整体架构TiDB Server: 负责接收 SQL 请求,处理 SQL 相关的逻辑,并通过 PD 找到存储计算所需数据的 TiKV 地址,与 TiKV 交互获取数据,最终返回结果。PD: 是整个集群的管理模块,其主要工作有三个:一是存储集群的元信息(某个 Key 存储在哪个 TiKV 节点);二是对 TiKV 集群进行调度和负载均衡(如数据的迁移、Raft group leader 的迁移等);三是分配全局唯一且递增的事务 ID。TiKV Server: 负责存储数据,从外部看 TiKV

模式分解详解,分解为3NF与分解为BCNF_分解成3nf_RsqTcqssss的博客-程序员秘密

3NF:不存在非主属性对码的传递函数依赖或部分函数依赖。 如AB-C,A-&gt;C 码为(A,B),A,B是主属性,C是非主属性,C部分函数依赖于码,即不满足3NFBCNF:每个决定因素都包含码(相比于3NF,优点是加上了对主属性的限制) 另一种说法:①主属性完全函数依赖于不含它的码 ②没有任何属性完全函数依赖于非码的任何一组属性...

nodeJs对DICOM医学影像文件解析并保存为图片_cornerstonejs 保存标注_沪php攻城师的博客-程序员秘密

最近入职一家医疗硬件和软件开发的公司,负责一套医疗软件中DICOM部分的功能开发,因为对这个行业完全陌生,对DICOM也一无所知,所以很头疼,查了很多国内外的资料,才有了一定了解。软件需求是模仿国外知名的DICOM解析软件orthanc,实现他的功能。因为我们的软件后端使用nodejs实现,所以我需要用nodejs实现对dicom文件的解析及转换成png/jpg图片以供前后端使用。关于对DICOM文件的解析,网上有很多资料可查,我这里不详细复述了,我碰到的问题是dicom转成图片的问题。如果是前端,可以直接

随便推点

盘古开源顺势转型,开拓芯片市场_盘古开源的博客-程序员秘密

近年来,芯片产业快速发展,市场规模和技术水平都在不断提高。芯片是信息产业的核心之一。随着人工智能、智能制造、汽车电子、物联网、5G等为代表的新兴产业快速崛起,芯片成为我国信息技术发展的核心,被认为是科技领域的“新石油”。长期以来,由于芯片市场产业链的复杂性和发达国家的先发优势,导致我国在芯片领域处于薄弱地位。为了促进我国芯片产业的发展,国家出台了相关政策鼓励扶持芯片行业。盘古开源顺势而为,响应政府号召,以数据存储市场为核心,积极开拓芯片市场新领域。什么是芯片?芯片是一种集成电路,由大量的晶体管构成。

Linux操作系统常用log日志_flybirding1001的博客-程序员秘密

&#13;&#13;&#13; Linux操作系统常用log日志 &#13;&#13;&#13;&#13; &#13; &#13; &#13; &#13;...

SpringBoot:spring-boot-devtools在idea中实现热部署_张小菜在路上的博客-程序员秘密

springBoot对调试支持很好,修改之后可以实时生效1.修改pom文件&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-boot-devtools&amp;lt;/artifactId&amp;gt; &amp;lt;optional&amp;gt;true&amp;l...

UFT\QTP 12 即将发布!_qtp12新特性_TIB的博客-程序员秘密

据小道消息称HP将于最近发布UFT\QTP 12主要变化在:安装文件小些自动上传测试结果到ALMMac下的Safari浏览器支持支持所有浏览器的最新版本支持VS 2010与2012

Ubuntu17.10+Cuda9.2+Cudnn7.1+Anaconda+tensorflow 深度学习环境搭建_彬-的博客-程序员秘密

机缘巧合之下安装ubuntu17.10过程一堆坑,在帖子中记录一下。过程中参考以下及若干链接,感谢感谢!!https://blog.csdn.net/luoweiyiroy/article/details/79974241https://askubuntu.com/questions/967332/how-can-i-install-cuda-9-on-ubuntu-17-10 过程如下:1 安...

Centos6.5配置yum源_centos6.5 yum源配置_听说我是神的博客-程序员秘密

示例:cd /etc/yum.repos.d/rename .repo .repo.bak *cp CentOS-Media.repo.bak CentOS-Media.repovi CentOS-Media.repo/////////////////////////////////[c6-media]name=CentOS-$releasever - Mediabaseurl=f...