在IntellijIEDA做java和cc++混编
最近公司项⽬做语⾳录⾳,涉及导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, 注意包路径这⾥是 st
package st;
public class JNITest {
//定义⼀个本地⽅法
public native int sayHello();
}
2) 编译JniTest.java,⽣成JniTest.class⽂件
c和java先学哪个
javac JniTest.java
3) ⽣成JniTest.h c/c++ 头⽂件,注意st.JniTest不带任何后缀
cd 到包的跟⽬录这⾥是src/main/java
javah st.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 ==========");
}
运⾏测试类:遇到
可以run =》Edit configurations 配置,路径换成你⾃⼰的链接库所在的位置
如果要运⾏在tomcat容器中,需要把链接库放到tomcat⽬录下⾯的bin⽬录下即可
⼤功告成,get 混编技能!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。