java调用c++函数的简单笔记
java使用jni调用c++动态库函数.
步骤:
1.编写java测试代码如下:
1 public class CallNativeDemo { 2 native void func(); 3 4 native double add(double a, double b); 5 6 public static void main(String[] args) { 7 System.loadLibrary("Main"); 8 CallNativeDemo callNativeDemo = new CallNativeDemo(); 9 callNativeDemo.func(); 10 System.out.println(callNativeDemo.add(1,2)); 11 } 12 }
2. 使用javac 对代码进行编译:
javac CallNativeDemo.java
3.使用javah 生成CallNativeDemo.h头文件.
javah -cp . CallNativeDemo
生成的代码如下:
1 /* DO NOT EDIT THIS FILE - it is machine generated */ 2 #include <jni.h> 3 /* Header for class CallNativeDemo */ 4 5 #ifndef _Included_CallNativeDemo 6 #define _Included_CallNativeDemo 7 #ifdef __cplusplus 8 extern "C" { 9 #endif 10 /* 11 * Class: CallNativeDemo 12 * Method: func 13 * Signature: ()V 14 */ 15 JNIEXPORT void JNICALL Java_CallNativeDemo_func 16 (JNIEnv *, jobject); 17 18 /* 19 * Class: CallNativeDemo 20 * Method: add 21 * Signature: (DD)D 22 */ 23 JNIEXPORT jdouble JNICALL Java_CallNativeDemo_add 24 (JNIEnv *, jobject, jdouble, jdouble); 25 26 #ifdef __cplusplus 27 } 28 #endif 29 #endif
4.编写Main.cpp文件,如果使用的是.c文件,去掉extern "C"{}
1 #include <jni.h> 2 #include <stdio.h> 3 /* 4 * Class: CallNativeDemo 5 * Method: func 6 * Signature: ()V 7 */ 8 extern "C"{ 9 JNIEXPORT void JNICALL Java_CallNativeDemo_func 10 (JNIEnv *env, jobject job){ 11 printf("hello world! by java and C++ "); 12 } 13 14 /* 15 * Class: CallNativeDemo 16 * Method: add 17 * Signature: (II)V 18 */ 19 JNIEXPORT jdouble JNICALL Java_CallNativeDemo_add 20 (JNIEnv *env, jobject job, jdouble a, jdouble b){ 21 22 return a+b; 23 } 24 }