专栏首页mljava调用c++函数的简单笔记

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++\n");
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 }

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)

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • web基础之hibernate(一篇)

                                                                   hibernate的一些基本的认识...

    Gxjun
  • hdu-----(1151)Air Raid(最小覆盖路径)

    Air Raid Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (...

    Gxjun
  • md5算法原理一窥(其一)

        首先,需要了解的事,md5并不是传说中的加密算法,只是一种散列算法。其加密的算法并不是我们说所的那样固定不变,只是一种映射的关系。 所以解密MD5没有现...

    Gxjun
  • 评分系统-能够计算游戏中的抽象数量

    在本节中,我们将实施评分系统。此功能将允许我们收集珠宝并将计数器的数量增加1.当满足一定数量时,我们会将我们的玩家发送到下一级别。

    iOSDevLog
  • 三星你在逗我吗?说好的可折叠屏手机改变世界呢?

    透过现场的介绍,我们可以感受出,折叠屏手机已经不仅仅是一款产品,更承载了三星对交互方式和智能硬件形态变革的寄托。

    镁客网
  • 【Python 第71课】变量的作用域

    在写代码的时候,免不了要使用变量。但程序中的一个变量并不一定是在哪里都可以被使用,根据情况不同,会有不同的“有效范围”。看这样一段代码: def func(x)...

    Crossin先生
  • JUC 多线程 CAS 算法

    解释:一个线程在使用atomicInteger原子变量进行修改值的操作中,底层的CAS算法会拿自己工作空间的值去和主内存空间的值去比较,如果主内存值和期望数值5...

    万能青年
  • 2.GO-可变参数函数,匿名函数和函数变量

    zhang_derek
  • 【转】Go 语言函数

    Go 语言标准库提供了多种可动用的内置的函数。例如,len() 函数可以接受不同类型参数并返回该类型的长度。如果我们传入的是字符串则返回字符串的长度,如果传入的...

    yiduwangkai
  • package runtime

    runtime包提供和go运行时环境的互操作,如控制go程的函数。它也包括用于reflect包的低层次类型信息;参见reflect报的文档获取运行时类型系统的可...

    李海彬

扫码关注云+社区

领取腾讯云代金券