1.在Eclipse中配置Javah,配置如下

位置是你javah.exe在你电脑磁盘上的路径

位置:C:\Program Files\Java\jdk1.8.0_112\bin\javah.exe

工作目录:${project_loc}/src

自变量:-classpath .;./classes -d  "${project_loc}/jni" -jni ${java_type_name}


2.创建一个java文件

 1 package experience5;
2
3 public class NewNineToNine {
4 public native void showInfo();
5 static{
6 System.loadLibrary("sy5-1");
7 }
8 public static void main(String[] args) {
9 // TODO Auto-generated method stub
10 NewNineToNine obj = new NewNineToNine();
11 obj.showInfo();
12 }
13
14 }
15

注意导入动态链接库不需要加后缀名

将要用C++或C语言实现的方法设置成native类型


 3.选择要通过javah生成的类

(需要点击一下吧,不然会报错:Launching javah has encountered a problem.The selected resourse does not resolve to a Java element

或者Launching javah has encountered a problem.Variable references empty selection :${project_loc}

只要点击了就好,个人觉得是这样哇》。《)

然后点击运行

这样就会在工程文件夹里生成一个jni的文件夹:

在jni包里面生成了“experience5_NewNineToNine.h”


4.编写一个C++文件,我用的是猥琐死丢丢2013,选择win32控制台程序,创建一个空白的 dll动态链接库

复制之前生成的“experience5_NewNineToNine.h“文件,

和C:\Program Files (x86)\Java\jdk1.8.0_151\include目录下的jni.h文件

,以及C:\Program Files (x86)\Java\jdk1.8.0_151\include\win32目录下的jni_md.h文件放到和test.cpp同目录下

=======================

“experience5_NewNineToNine.h”文件:注意javah编译出的头文件打开之后显示的是#include<jni.h>因为我们要引入jdk下的 jni.h文件,所以要用双引号

/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class experience5_NewNineToNine */ #ifndef _Included_experience5_NewNineToNine
#define _Included_experience5_NewNineToNine
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: experience5_NewNineToNine
* Method: showInfo
* Signature: ()
*/
JNIEXPORT void JNICALL Java_experience5_NewNineToNine_showInfo
(JNIEnv *, jobject); #ifdef __cplusplus
}
#endif
#endif
在源文件中创建一个test.cpp
JNIEXPORT void JNICALL Java_experience5_NewNineToNine_showInfo
(JNIEnv *, jobject);
就是在javah生成的头文件中声明的方法,我们需要在test.cpp中把这个方法实现
这些代码没优化,只到了能用的程度

test.cpp:
 1 #include<iostream>
2 #include"experience5_NewNineToNine.h"
3 using namespace std;
4 JNIEXPORT void JNICALL Java_experience5_NewNineToNine_showInfo(JNIEnv *env, jobject obj)
5 {
6 int a[11][11];
7 for (int i = 1; i <= 10; i++) {
8 a[i][1] = 1;
9 a[i][i] = 1;
10 for (int j = 2; j<i; j++) {
11 a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
12 }
13
14 if (i>1) {
15 for (int z = 0; z < (10 - i); z++) {
16 printf(" ");
17
18 }
19 for (int j = 1; j <= i; j++) {
20 cout << " " << a[i][j];
21 }
22 }
23 else cout << " " << a[1][1] << endl;
24
25 cout << endl;
26
27 }
28 }

.要在java中输出的内容就在test.cpp中的

 JNIEXPORT void JNICALL Java_experience5_NewNineToNine_showInfo(JNIEnv *env, jobject obj)方法体中实现
然后直接编译运行过,会提示不能运行.dll文件,那么成功生成sy5-1.dll

==================
然后还没完:
  让java程序成功调用sy5-1.dll有两种方法,自然有一种比较烦
    1.复制sy5-1.dll到系统的C:\Windows\System32目录下,默认环境变量有这个
    2.配置环境变量指向动态链接库所在的路径(这种表达我也不知道对不对,意思到了就好0.0)

配置好了就不用一次一次复制了,


==================
最后一步:
    重启eclipse,编译运行。结果如下:


发生的问题:
  1.抛出了java.lang.UnsatisfiedLinkError异常: no sy1 in java.library.path,程序没找到.dll文件,放对位置就没毛病了
  2.can't load IA 32-bit .dll on a AMD 64-bit platform错误,参考网上回答,最后我用了一个32位的JDK然后妥了;
    然后在StackOverflow里有个回答:https://stackoverflow.com/questions/8113080/cant-load-ia-32-bit-dll-on-a-amd-64-bit-platform
    里面是用cmd编译运行,有点迷,所以干脆下个32位JDK一了百了
  3.溜了溜了



 

Java小题,通过JNI调用本地C++共享库中的对应方法实现杨辉三角的绘制的更多相关文章

  1. java实现组合数_n!_杨辉三角_组合数递推公式_回文数_汉诺塔问题

    一,使用计算机计算组合数 1,设计思想 (1)使用组合数公式利用n!来计算Cn^k=n!/k!(n-k)!用递推计算阶乘 (2)使用递推的方法用杨辉三角计算Cn+1^k=Cn^k-1+Cn^k 通过数 ...

  2. java基础:进制详细介绍,进制快速转换,二维数组详解,循环嵌套应用,杨辉三角实现正倒直角正倒等腰三角,附练习案列

    1.Debug模式 1.1 什么是Debug模式 是供程序员使用的程序调试工具,它可以用于查看程序的执行流程,也可以用于追踪程序执行过程来调试程序. 1.2 Debug介绍与操作流程 如何加断点 选择 ...

  3. 第119题:杨辉三角II

    一. 问题描述 给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行. 在杨辉三角中,每个数是它左上方和右上方的数的和. 示例: 输入: 3 输出: [1,3,3,1] 二. 解题思路 ...

  4. 1233: 输出杨辉三角前n行(Java)

    WUSTOJ 1233: 输出杨辉三角前n行 题目 原题链接 Description 输出杨辉三角前n行. Input 输入一个数n(n <= 9) Output 输出杨辉三角前n行.(注意行末 ...

  5. Java的二维数组的应用及杨辉三角的编写

    (1) 编写一个程序,生成一个10*10的二维随机整数数组,并将该数组的每行最大值保存于一个一维数组中,将每列平均值保存于另外一个一维数组中并分别输出. (2) 编程输出杨辉三角的前10行. 找出一个 ...

  6. 使用Java打印杨辉三角

    package 杨辉三角; import java.util.Scanner; public class 三角 { private static Scanner scn; public static ...

  7. Java数组的应用:案例:杨辉三角,三维数组,字符串数组

    //import java.util.Arrays; //包含Arrays //import java.util.Random; public class HelloWorld { public st ...

  8. Java实现杨辉三角

    杨辉三角用了两种方法解决 二维数组/递归方法 +—————————————————————————— import java.util.Scanner; public class YangHui02 ...

  9. [Java练习题] -- 1. 使用java打印杨辉三角

    package cn.fzm.demo1.array; import java.util.Scanner; /* * 需求:打印杨辉三角形(行数可以键盘录入) 1 1 1 1 2 1 1 3 3 1 ...

随机推荐

  1. androidstudio创建第一个so文件

    前言:之前看安卓软件安全与逆向分析这书,看到ndk开发这节,发现自己连so文件都没编译操作过233,所以就直接上手试试, 感觉挺好玩的,把关键的加密流程都放进so中去实现,这周先写个demo试试,感觉 ...

  2. ELK处理Spring Boot 日志,妙!

    在排查线上异常的过程中,查询日志总是必不可缺的一部分.现今大多采用的微服务架构,日志被分散在不同的机器上,使得日志的查询变得异常困难. 工欲善其事,必先利其器.如果此时有一个统一的实时日志分析平台,那 ...

  3. OSSBrowser windows使用

    目录 1. 安装 2. 启动OSSBrowser并登录 1. 安装 下载地址:github或官方 2. 启动OSSBrowser并登录 ossbrowser安装包下载到本地解压之后,点击oss-bro ...

  4. CTF文件包含

    <?php include "flag.php"; $a = @$_REQUEST['hello']; eval( "var_dump($a);"); s ...

  5. python twain 扫描

    def multiScan(self): """ Scan and return an array of PIL objects If no images, will r ...

  6. c语言:DEV-C++5.10调试设置

    DEV-C++调试设置方法:默认不能调试,打开调试的方法: 1.点击"工具"菜单--编译选项--"代码生成/优化"--连接器--"产生调试信息&quo ...

  7. 家庭账本开发day07

    返回数据问题解决,需要按照规定的json数据进行返回. 利用jsonobejact或者GSON工具将对象ArrayList转化为json 格式.然后response.getWriter().write ...

  8. mysql 按照年统计数据并存到新表中

    参考:https://blog.csdn.net/u013201439/article/details/78116575 CREATE TABLE count_year SELECT YEAR(req ...

  9. 春招后端阿里腾讯字节美团Offer拿来吧你,面试经验分享

    近期很多童鞋在准备校招了,找了蚂蚁的一位童鞋,给大家分享一波面试经验,以及面试心得,希望能帮大家在秋招拿到一个好结果 我自己的22届春招实习算是告一段落,给自己做个总结,也给大家分享一下面试的一些心得 ...

  10. java并发编程基础——线程的创建

    一.基础概念 1.进程和线程 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程.(进程是资源分配的最小单位) 线程:同一类线程共享代码和数据 ...