zoukankan      html  css  js  c++  java
  • 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
    View Code

    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 }
    View Code

    5.使用locate/find 查询jdk位置.

    locate jdk

    6.编写Makefile文件.

     1 #makefile
     2 
     3 .SUFFIXES: .o.cpp
     4 .PHONY:    clean
     5 .PHONY: start
     6 
     7 
     8 JDKLIB =/home/gongxijun/java/jdk1.7.0_40/include
     9 CC =g++
    10 SRC =Main.cpp
    11 OBJS =$(SRC:.cpp =.o)
    12 OS = libMain.so
    13 
    14 .PHONY: start
    15 start: $(OBJS)
    16     $(CC) -shared -fpic -I $(JDKLIB) -I $(JDKLIB)/linux -o $(OS) $(OBJS)
    17 .o.cpp:$(SRC)
    18     $(CC) -g -Wall $@ -c $<
    19 .PHONY: clean
    20 clean:
    21     rm -f $(OBJS)
    View Code

    7.使用make 编译Makefile文件,生成.so动态库.

    make Makefile 或者直接 make

    8.运行java程序.

    java -cp . -Djava.library.path=. CallNativeDemo

    8.1结果如下:

    hello world! by java and C++
    3.0
    

      

  • 相关阅读:
    18、【opencv入门】形态学图像处理(一):开运算、闭运算、形态学梯度、顶帽、黑帽合辑
    17、【opencv入门】形态学图像处理(一):膨胀与腐蚀
    16、【opencv入门】创建Trackbar & 图像对比度、亮度值调整
    c++ 售货员的难题
    c++ 火柴棒等式
    c++ 素数圈
    c++ 分解数
    c++ 走迷宫
    c++ 二叉树遍历
    c++ n皇后问题
  • 原文地址:https://www.cnblogs.com/gongxijun/p/6433860.html
Copyright © 2011-2022 走看看