JNI测试-java调用c算法并返回java调用处-1到20阶乘的和

一,java端:

  定义native方法, ‘public native long factorial(int n);‘, 该方法用c/c++实现,计算‘1到20阶乘的和‘,参数中‘int n‘是前n项的阶乘的和(这里是20).返回计算结果,并返回java调用处.

代码为:

 1 public class FactorialJava {
 2
 3     public native long factorial(int n);
 4
 5     //evaluate the elapse time.and the execution result.
 6     public long elapse() {
 7         long start = System.currentTimeMillis();
 8
 9         // code executing time.
10         long sumResult = factorial(20);
11
12         System.out.println("sum_result:" + sumResult);
13
14         long end = System.currentTimeMillis();
15         return end - start;
16     }
17
18     //load the dll library before executing conductive code.
19     static {
20         System.loadLibrary("FactorialDll");
21     }
22
23     public static void main(String[] args) {
24         FactorialJava fac = new FactorialJava();
25         System.out.println("耗时: " + fac.elapse() + " 毫秒");
26     }
27
28 }

二,c/c++在vs中新建一个能产生dll动态链接库的项目,并实现java中定义的native方法.代码如下:

 1 jlong
 2 recesive_fac(jint n) {
 3     if(n == 1)
 4         return 1;
 5     else
 6     {
 7         return n * recesive_fac(n - 1);
 8     }
 9 }
10
11 //使用jni循环递归过程,将结果返回java调用处.
12 JNIEXPORT jlong JNICALL Java_FactorialJava_factorial
13   (JNIEnv *env, jobject obj, jint n) {
14     jlong sum = 0;
15     //const jint n = 20;
16     for(int i = 1; i <= n; i++) {
17         sum += recesive_fac(i);
18     }
19
20     return sum;
21 }

其中,调用过程需要引入的额外头文件,配置eclipse中的classpath的步骤在博客中的 java JNI 的实现(1)-又进一步加深对JVM实现的理解 中.

时间: 2024-10-22 04:43:48

JNI测试-java调用c算法并返回java调用处-1到20阶乘的和的相关文章

在idea2018和vs2017平台下JNI编程调用C++算法(2)-调用嵌套dll实践

背景 我之所以采用JNI是由于我要实现一个java系统,java系统需调用C++核心程序.而目前的需求是不想破坏C++核心程序的独立性.因此想把JNI调用的接口写在C++核心程序之外.这就需要 首先将C++核心程序生成内层dll 在外层包装一层JNI接口调用内层dll 再将外层C++生成外层dll后,java调用外层dll. 那么JNI支持这种嵌套dll调用吗?经验告诉我肯定能,但是程序员从来不敢想当然,那就让我们试一试,顺便理清思路吧. 上篇文章介绍了在idea2018和vs2017两大平台下

职责链 评价:挺好玩的 稍微复杂版 类似出栈入栈 (原理职责链调用一个之后跳转到第二个执行在跳转第三个执行 接下来因为每次调用完后都会返回被调用的位置)

using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace ConsoleApplication20{    public class Response    {        public string ResponseStr { get; set; }                     } public class Request    {        pub

java实现fp-growth算法

本文參考韩家炜<数据挖掘-概念与技术>一书第六章,前提条件要理解 apriori算法. 另外一篇写得较好的文章在此推荐: http://hi.baidu.com/nefzpohtpndhovr/item/9d5c371ba2dbdc0ed1d66dca 0.实验数据集: user2items.csv I1,I2,I5 I2,I4 I2,I3 I1,I2,I4 I1,I3 I2,I3 I1,I3 I1,I2,I3,I5 I1,I2,I3 1.算法原理 构造FPTree 1.首先读取数据库中全部种

第三次博客作业package com.fry; //导入java.util.Arrays; import java.util.Arrays; public class Demo1 { public static void main(String[]args){ //创建对象,对象名为hello Demo1 hello =new Demo1(); //调用方法并将返回值保存在变量中

1.  某网站管理系统,用户注册时,电话号码为可选输入项,输入格式为:区号-电话号码—分机号,中间用“-”隔开.以下为jsp页面上的设计,且并未对输入做任何控制. 假设系统现在需要取出中间的电话号码部分,代码如下: /** * * 该方法根据用户输入取出中间的电话号码部分 * @param strPhoneNum 电话号码,如:“0591-83279988—002” * @return 返回号码部分,如:“83279988” */ public String getPhoneNumber(Str

java servlet调用带有多个返回结果集的存储过程

一.mysql存储过程 这里我先说下我这个功能实现的逻辑及途中遇到的一些问题.这个存储过程一共带两个输入参数,一共关联到两张表的查询,每个参数都对应查询表中的一个判断,所以一共返回了两个结果集(当然要返回更多结果集也是一样的,如果需要判断,就继续增加存储过程参数,如果不需要判断就直接在存储过程中,增加查询的SQL语句即可).实现这个功能还有更简单的方法,可以写SQL关联语句查询出两张表的结果,返回一个组合的结果集.我这里当然是为了实现这个效果,所以把它的实现复杂化了.继续说下我今天在mysql上

Java採用JNI调用VC++生成的dll(Java与C++交互)

应项目需求,须要android调用java,java再调用C++实现android一个图片匹配的功能,我们作为java组须要和C++和Android进行交互.以下是java和C++採用JNI的方式进行接口传參交互,我做的一个demo并执行成功. 什么是JNI? JNI全拼是Java Native Interface,中文意思为Java本地调用.JNI标准是Java平台的一部分.它同意java和其它语言的代码进行交互.JNI開始是为了本地已经编译好的语言,尤其是C和C++而设计的.我们也能够使用J

java 在centos6.5+eclipse环境下调用opencv实现sift算法

java 在centos6.5+eclipse环境下调用opencv实现sift算法,代码如下: import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.MatOfKeyPoint; import org.opencv.highgui.Highgui; import org.opencv.features2d.*; public class ExtractSIFT{ public static

Java采用JNI调用VC++生成的dll(Java与C++交互)

应项目需求,需要android调用java,java再调用C++实现android一个图片匹配的功能,我们作为java组需要和C++和Android进行交互.下面是java和C++采用JNI的方式进行接口传参交互,我做的一个demo并运行成功. 什么是JNI? JNI全拼是Java Native Interface,中文意思为Java本地调用.JNI标准是Java平台的一部分,它允许java和其他语言的代码进行交互.JNI开始是为了本地已经编译好的语言,尤其是C和C++而设计的,我们也可以使用J

JAVA调用系统命令或可执行程序--返回一个Runtime运行时对象,然后启动另外一个进程来执行命令

通过 java.lang.Runtime 类可以方便的调用操作系统命令,或者一个可执行程序,下面的小例子我在windows和linux分别测试过,都通过.基本原理是,首先通过 Runtime.getRuntime() 返回与当前 Java 应用程序相关的运行时对象,然后调用run.exec(cmd)  另启一个进程来执行命令(cmd为要执行的命令). 一.运行一个可执行程序 执行一个.exe的文件,或通过已安装的软件打开一个特定格式的文件,如word.chm或mp3等等. 1. 在window下