java使用jni调用c++动态库函数.

步骤:

1.编写java测试代码如下:

 public class CallNativeDemo {
native void func(); native double add(double a, double b); public static void main(String[] args) {
System.loadLibrary("Main");
CallNativeDemo callNativeDemo = new CallNativeDemo();
callNativeDemo.func();
System.out.println(callNativeDemo.add(1,2));
}
}

2. 使用javac 对代码进行编译:

javac CallNativeDemo.java

3.使用javah 生成CallNativeDemo.h头文件.

javah -cp . CallNativeDemo

生成的代码如下:

 /* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class CallNativeDemo */ #ifndef _Included_CallNativeDemo
#define _Included_CallNativeDemo
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: CallNativeDemo
* Method: func
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_CallNativeDemo_func
(JNIEnv *, jobject); /*
* Class: CallNativeDemo
* Method: add
* Signature: (DD)D
*/
JNIEXPORT jdouble JNICALL Java_CallNativeDemo_add
(JNIEnv *, jobject, jdouble, jdouble); #ifdef __cplusplus
}
#endif
#endif

4.编写Main.cpp文件,如果使用的是.c文件,去掉extern "C"{}

 #include <jni.h>
#include <stdio.h>
/*
* Class: CallNativeDemo
* Method: func
* Signature: ()V
*/
extern "C"{
JNIEXPORT void JNICALL Java_CallNativeDemo_func
(JNIEnv *env, jobject job){
printf("hello world! by java and C++\n");
} /*
* Class: CallNativeDemo
* Method: add
* Signature: (II)V
*/
JNIEXPORT jdouble JNICALL Java_CallNativeDemo_add
(JNIEnv *env, jobject job, jdouble a, jdouble b){ return a+b;
}
}

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

locate jdk

6.编写Makefile文件.

 #makefile

 .SUFFIXES: .o.cpp
.PHONY: clean
.PHONY: start JDKLIB =/home/gongxijun/java/jdk1.7.0_40/include
CC =g++
SRC =Main.cpp
OBJS =$(SRC:.cpp =.o)
OS = libMain.so .PHONY: start
start: $(OBJS)
$(CC) -shared -fpic -I $(JDKLIB) -I $(JDKLIB)/linux -o $(OS) $(OBJS)
.o.cpp:$(SRC)
$(CC) -g -Wall $@ -c $<
.PHONY: clean
clean:
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

  

java调用c++函数的简单笔记的更多相关文章

  1. Android使用JNI(从java调用本地函数)

    当编写一个混合有本地C代码和Java的应用程序时,需要使用Java本地接口(JNI)作为连接桥梁.JNI作为一个软件层和API,允许使用本地代码调用Java对象的方法,同时也允许在Java方法中调用本 ...

  2. java调用matlab函数

    如何将实验结果在matlab中可视化呢,下面使用java语言编程,调用matlab中的函数: 本人安装的是Matlab7.11.0 (R2010a)和 Eclipse 4.2 : 1)首先设置环境变量 ...

  3. Linux平台下Java调用C函数

    JNI是Java native interface的简写,可以译作Java原生接口.Java可以通过JNI调用C/C++的库,这对于那些对性能要求比较高的Java程序无疑是一个 福音. 使用JNI也是 ...

  4. Java 调用 Javascript 函数的范例

    在Java 7 以后,可以在Java代码中调用javascript中的函数,请看下面的例子: package com.lee; import java.io.FileNotFoundException ...

  5. Java调用C函数

    一.关于JNI JNI( Java Native Interface )主要是实现Java和C/C++语言之间的通信. Java通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOW ...

  6. java调用c/c++代码简单实现以及遇见的坑

    以下内容均来自互联网,感谢你们的分享,我只是使用的时候看这方便,可以称呼我“搬运工” 如有不合适的地方请与我联系,我会及时改正 首先你可能会遇见以下错误 第一个错误是你在vs编译器没有选择使用rele ...

  7. Item 5:那些被C++默默地声明和调用的函数 Effective C++笔记

    Item 5: Know what functions C++ silently writes and calls 在C++中,编译器会自己主动生成一些你没有显式定义的函数,它们包含:构造函数.析构函 ...

  8. java调用webservice,比较简单方便的方法。

    首先,请同学们自行了解webservice的基础知识. 个人理解,webservice约等于使用http+xml技术进行跨平台的数据交互. http和xml我们都很熟悉了,把他们两个组合到一起就是we ...

  9. java调用js函数

    问题:js函数可能有多个,之间有相互调用关系,有jquery jar包 org.mozilla.javascript-1.7.2 js   envjs-1.2.js java代码 import jav ...

随机推荐

  1. SGD

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. win64环境下使用curl命令

    想在windows环境下使用curl命令,其实很简单,简单配置如下: 工具下载 在官网下载工具包:https://curl.haxx.se/download.html 我这里下载的是zip版本的,下载 ...

  3. 中文颜色名称与RGB颜色对照表

    中文颜色名称颜色对照表 鸨色 #f7acbc 赤白橡 #deab8a 油色 #817936 绀桔梗 #444693 踯躅色 #ef5b9c 肌色 #fedcbd 伽罗色 #7f7522 花色 #2b4 ...

  4. SpringBoot学习笔记

    SpringBoot个人感觉比SpringMVC还要好用的一个框架,很多注解配置可以非常灵活的在代码中运用起来: springBoot学习笔记: .一.aop: 新建一个类HttpAspect,类上添 ...

  5. iOS----------如何检查域名是否支持ipv6

    http://ipv6-test.com/validate.php  这个地址  也可以检测到! 1.检查你所用到的库,像af 3.0以上什么的(不用改),其他的库自己去搜下是否支持ipv6吧. 2. ...

  6. C#中MessageBox用法大全(转)

    我们在程序中经常会用到MessageBox. MessageBox.Show()共有21中重载方法.现将其常见用法总结如下: 1.MessageBox.Show("Hello~~~~&quo ...

  7. Java I/O---输入与输出

    编程语言的I/O类库中常使用流这个抽象概念, 它代表任何有能力产出数据的数据源对象或者是有能力接收数据的接收端对象. "流" 屏蔽了实际的I/O设备中处理数据的细节.Java类库中 ...

  8. Windows编程之进程遍历(C++实现)

    Windows编程之进程遍历 PS: 主要扣代码使用,直接滑动到最下面使用. 遍历进程需要几个API,和一个结构体 1.创建进程快照 2.遍历首次进程 3.继续下次遍历 4.进程信息结构体 API 分 ...

  9. CSS3 转换2D transform

    Transform字面上就是变形,改变的意思.在CSS3中transform主要包括以下几种:旋转rotate.扭曲skew.缩放scale和移动translate以及矩阵变形matrix.下面我们一 ...

  10. JavaScript的DOM编程--09--节点的替换

    节点的替换: 1). replaceChild(): 把一个给定父元素里的一个子节点替换为另外一个子节点 var reference = element.replaceChild(newChild,o ...