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. 后台程序处理(二) python threading - queue 模块使用

    由于协程没办法完成(一)中所说的任务模式 接下来就尝试一下使用线程和队列来实现一下这个功能 在实现之前,我们先明确一个问题--python的线程是伪并发的.同一时间只能有一个线程在运行.具体怎样的运作 ...

  2. 非常有用的GitHub链接

    平常开发工作中,我经常取Github上搜索项目,Clone下来学习使用,在这个过程中,发现了好多比较好的Github地址,记录下来,分享出去. image 非常有用的GitHub链接(顺序不分先后): ...

  3. 【java】获取当前环境属性及编码乱码示例

    package 字符编码; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; impo ...

  4. 【二十一】基于mysqli的表格数据练习

    mysqlitest.php <?php //调用数据库的函数 function connetionsql(){ $conn=mysqli_connect("127.0.0.1&quo ...

  5. iOS框架搭建(MVC,自定义TabBar)--微博搭建为例

    项目搭建 1.新建一个微博的项目,去掉屏幕旋转 2.设置屏幕方向-->只有竖向 3.使用代码构建UI,不使用storyboard 4.配置图标AppIcon和LaunchImage 将微博资料的 ...

  6. SQL Server 数据库引擎怎样记录完整备份后修改过的数据

    SQL Server 使用两个内部数据结构跟踪被大容量复制操作修改的区,以及自上次完整备份后修改的区.这些数据结构极大地加快了差异备份的速度.当数据库使用大容量日志恢复模式时,这些数据结构也可以加快将 ...

  7. PipeHttp 测试工具使用

      以下简单介绍下参数工具的使用     GitHub地址: https://github.com/lulianqi/PipeHttp/ (工程地址) https://github.com/lulia ...

  8. vbs的一些入门基础。。。

    VBS(VBScript的进一步简写)是基于Visual Basic的脚本语言. Microsoft Visual Basic是微软公司出品的一套可视化编程工具, 语法基于Basic. 脚本语言, 就 ...

  9. 讲述Sagit.Framework解决:双向引用导致的IOS内存泄漏(上)

    前言: 好久没写文章了,最近先是重构IT恋.又重写IT恋中. Sagit框架也不断的更新,调整,现在感觉已完美了了相当的多. 今天不写教程,先简单分享一下技术内容. 1:见Block必有:#defin ...

  10. linux编译php gd扩展

    1 安装gd的依赖包 yum -y install gd gd2 gd-devel gd2-devel zlib freetype 2 安装jpeg: wget http://www.ijg.org/ ...