一、简单java application示例篇

转载请注明:https://blog.csdn.net/xitie8523/article/details/79926948

本科毕业设计是图像分割相关的,在vs2013上写好了算法,需要用手机传图片到服务器,在服务器进行分割,服务器是用java写的,因此需要用java调用C++。刚来的菜鸟,一步一步走的,网上找了一篇博客跟着操作一下https://blog.csdn.net/lovesummerforever/article/details/25827199 以下为具体操作过程(和前面链接基本一致),可看前面链接的博客,懒得换页面的可以直接看下面

1、编写java源码

新建一个工程(工程名字可以随意取,testJNI之类的 ),在src下建立com包,在com包下面建立java类Reliability.java。代码如下:

package com;
public class Reliability {public native static int shanfei(int i); //声明方法,该方法用C++实现,定义为native,而static是为了//main里面调用时不用实例化,也可以不加static然后实例化调用方法public static void main(String[] args) {  System.loadLibrary("Reliability"); // 这里是加载dllSystem.out.print(Reliability.shanfei(6));  //main里面调用了方法,该方法会用C++实现 }
}

2、编译成.class和.h文件

将源文件编译成.class文件可以直接进入文件位置用javac命令编译,此时在.java文件同目录生成.class文件

 

进入编译成class文件的上一级目录(在这里是src下)用javah命令生成.h文件,命令行是:javah -classpath . -jni com.Reliability,将在src下生成com_Reliability.h文件

或者如果用myeclipse写的代码,保存后会自动生成.class文件,在bin目录下面的包com文件夹下,可在myeclipse中设置

            

同样转到上一级目录,这里是bin目录,用javah -classpath . -jni com.Reliability生成.h文件,上面两种方法选择哪一种都无关紧要,主要是为了生成.h文件。

3、C++新建dll

以上myeclipse这边就准备好了,打开vs2013,文件——>新建——>项目——>选择win32控制台程序(或者win32项目都可)——>改名称——>确定

点击下一步,选中Dll和空项目,然后完成

4、生成Dll文件

将com_Reliability.h作为头文件添加到工程里面,新建Reliability.cpp源文件,并将jni.h和jni_md.h(我是在myeclipse文件夹里找的)作为外部依赖文件导入工程,具体如下:

打开属性管理器——>右击——>点击属性——>转到VC++/常规/附加包含目录 ——>添加文件夹,这里我是把两个.h文件新建一个external_h(随便起的名)文件夹,然后将这个文件夹添加到附加包含目录里

生成的com_Relability.h文件(不用我们写,但是这段代码是有规律的)

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_Reliability */#ifndef _Included_com_Reliability
#define _Included_com_Reliability
#ifdef __cplusplus
extern "C" {
#endif
/** Class:     com_Reliability* Method:    shanfei* Signature: (I)I*/
JNIEXPORT jint JNICALL Java_com_Reliability_shanfei(JNIEnv *, jclass, jint);#ifdef __cplusplus
}
#endif
#endif

Reliability.cpp源文件:

#include<stdio.h>
#include<jni.h>
#include<jni_md.h>
#include "com_Reliability.h"JNIEXPORT jint JNICALL Java_com_Reliability_shanfei   //这是从.h文件中copy过来的方法声明
(JNIEnv *, jclass, jint p){int j = 2 * p;return j;}

生成解决方案,然后会在相应的文件夹生成dll文件,进入文件夹将Reliability.dll拷贝到jdk下jre的bin目录下,然后运行myeclipse程序即可得到结果

5、一系列问题的总结:

(1)当我将Reliability.dll拷到工程目录下,或者拷到system32,将抛出 java.lang.UnsatisfiedLinkError:  no Reliability in java.library.path 异常,找不到这个dll,说明无法加载.dll文件,一般是放的位置不对,可用System.out.println( System.getProperty("java.library.path") );输出路径,然后选择其中一个,可能有些还是加载不了,可以多试几个,或者在file——>properties——>java build path 添加native library location。

(2)当我在myeclipse中编写Reliability.java,加载dll时采用了try  catch捕捉异常时,同样也是将Reliability.dll直接放在工程文件下面,将抛出一个找不到方法的异常java.lang.UnsatisfiedLinkError:  com.Reliability.shanfei(I)I,如下图。这有可能是dll放的位置不对,也可能是生成的.h文件的问题,要检查一下.h文件,特别在有包的时候,注意函数名是java__一级包__二级包__类名__方法名。即如果是package a.b.c;  类名是testJNI,方法是fun();  则应为java_a_b_c_testJNI_fun()

(3)我的电脑是64位,jdk配置的也是64位的,当我的vs2013采用的是debug32或者Release32时,出现以下情况(此时dll文件是放在jdk下jre的bin目录下)

上图表明我的dll是32位的,因为我是在vs2013 debug32下生成的解决方案,但是我的myeclipse环境是64位的,而这有冲突了,因此我就在debug64 位下编译生成了dll文件,将其放在jre下的bin目录下,就能得到结果了,注意生成的dll文件具体是在哪个文件夹,这个在vs2013的输出里面会有写,不要直接在放着代码的文件夹里直接复制。同理也会遇到64位的dll,32位的环境等问题,按照上面的思路统一就好了。

下一篇是图像处理的C++算法用到java  tomcat服务器的实战过程和遇到的莫名其妙的问题。

java JNI调用C++代码(给出一个简单java application示例和实际java web项目过程及错误解决)(一)相关推荐

  1. java JNI调用C++代码(给出一个简单java application示例和实际java web项目过程及错误解决)(二)

    二.java web 服务器(tomcat)调用图像处理C++代码项目实例 转载请注明:https://blog.csdn.net/xitie8523/article/details/80009821 ...

  2. 建立一个Web项目及一些错误解决办法

    培训之前,先自学一波,写一个从Hello World,然后记录一下每天学习Java Web的过程:东西很多,有用的会写大量解释,希望能最终学完 然后搞定这门语言吧. 1.配置tomacat:点击win ...

  3. python小项目案例-Python小项目:快速开发出一个简单的学生管理系统

    本文根据实际项目中的一部分api 设计抽象出来,实例化成一个简单小例子,暂且叫作「学生管理系统」. 这个系统主要完成下面增删改查的功能: 包括: 学校信息的管理 教师信息的管理 学生信息的管理 根据A ...

  4. python项目开发实例-Python小项目:快速开发出一个简单的学生管理系统

    本文根据实际项目中的一部分api 设计抽象出来,实例化成一个简单小例子,暂且叫作「学生管理系统」. 这个系统主要完成下面增删改查的功能: 包括: 学校信息的管理 教师信息的管理 学生信息的管理 根据A ...

  5. [安卓开发笔记二]android Studio通过jni调用C++代码

    [安卓开发笔记二]android Studio通过jni调用C++代码 16/12/11 更新 此博客基于安卓android studio 1.5所写,现在已经有了android studio2.2的 ...

  6. Java中调用C++代码

    Java中调用C++代码 1.Idea创建一个Solution类 public class Solution {public native void sayHello();static{System. ...

  7. Java JNI调用IC卡读卡器

    Java JNI调用IC卡读卡器 Java调用IC卡读卡器的DLL一般有以下2种方式: 1.使用JNative第三方库调用IC卡读卡器dll的接口. 2.使用JNI调用IC卡读卡器dll的接口. JN ...

  8. 这是我第一次使用代码创建出一个窗口【python 游戏实战 01】

    前言 本系列文章将会以通俗易懂的对话方式进行教学,对话中将涵盖了新手在学习中的一般问题.此系列将会持续更新,包括别的语言以及实战都将使用对话的方式进行教学,基础编程语言教学适用于零基础小白,之后实战课 ...

  9. java实现调用打印机代码

    java实现调用打印机代码 java实现调用打印机代码,简单粗暴,直接上代码,这里需要把你的文件转成FileInputStream,ip取的是打印机的内网地址 /*** 通过 IP+端口 连接打印机打 ...

最新文章

  1. js正则表达式的使用详解
  2. SAP QM 物料主数据QM视图里字段MARC-INSMK的更新
  3. AdaBoost 和 Real Adaboost 总结
  4. 用友BQ商业智能平台——图表功能
  5. OCR系列——文本检测任务
  6. 莫比乌斯带catia建模_独家教程 | 循环曲面“莫比乌斯”,康石石教你Rhino“3步”快速打造...
  7. mysql将职称列改为工种_MySQL-其他
  8. 南大电子机器人入驻云南_园区优秀企业| 中科恒清清淤机器人,以智能科技为水环境治理保驾护航...
  9. javascript轻松解决前端数据排序(互换,置顶,上移,下移),快收藏吧
  10. C语言中sprintf()函数的用法
  11. 查看python源码位置方法以及潜在误区
  12. 【音频处理】之 Matlab 实现信号的时域和频域的滤波
  13. Python3实现批量下载百度搜索图片
  14. SpringMVC框架原理图
  15. 在积分系统中可以设置哪些获取积分方式
  16. 上位机使用C++通过ADS协议与倍福PLC通信例程-布尔变量的读取
  17. 全集然文明nbsp;(请点击图标进…
  18. c语言如何表示大于小于等于,Excel 公式中大于和小于等于计算应怎么写
  19. 用c语言写一个简单的名人名言播放器
  20. Blocking Queue

热门文章

  1. 教你两式妙招杀死“顽固不化”的病毒进程
  2. 如何用C#编写文本编辑器
  3. 大数据信息资料采集:中国知网文献资料网站数据信息资料爬取
  4. RT-Thread音频调试实战经验分享 - 基础篇
  5. HBase学习之路(七):理解计数器的基本概念及计数器的使用
  6. 超链分析和PageRank
  7. html页仿苹果手机悬浮可拖拽按钮
  8. 微观经济学(一)经济学十大原理
  9. 静态方法和非静态方法的区别
  10. 饿了么运维基础设施进化史