zoukankan      html  css  js  c++  java
  • 在Intellij IEDA 做 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 混编技能!

  • 相关阅读:
    HDU --1251
    POJ -- 2436
    POJ -- 3140
    POJ 3107
    POJ -- 2002
    POJ -- 1655
    lintcode154
    lintcode192
    lintcode582
    lintcode901
  • 原文地址:https://www.cnblogs.com/Lzly/p/6292506.html
Copyright © 2011-2022 走看看