LZLY_MAN

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

最近公司项目做语音录音,涉及导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  阅读(7915)  评论(0编辑  收藏  举报