• java上建立接口定义
package com.dtk;

public class Rec {

    public native String RecImage(String src);

    public static void main(String[] args) {

        }
}
  • 生成头文件:

cmd进入java类生成的class所在目录,一般是bin, 使用命令格式 [javah 包名.文件名], eg: javah com.dtk.Rec, 生成了com_dtk_Rec.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_dtk_Rec */ #ifndef _Included_com_dtk_Rec
#define _Included_com_dtk_Rec
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_dtk_Rec
* Method: RecImage
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_dtk_Rec_RecImage(JNIEnv *, jobject, jstring); #ifdef __cplusplus
}
#endif
#endif
  • 在VS中新建空console项目,引入com_dtk_Rec.h, 注意要配置jni.h等所在的目录,不然会有些undefine,
  • 写一个cpp实现掉com_dtk_Rec.h中的方法,修改项目生成dll文件,这里可以用opencv等
#include "com_dtk_Rec.h"
#include <opencv2/opencv.hpp> using namespace std;
using namespace cv; std::string jstring2str(JNIEnv* env, jstring jstr)
{
char* rtn = NULL;
jclass clsstring = env->FindClass("java/lang/String");
jstring strencode = env->NewStringUTF("GB2312");
jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
jbyteArray barr = (jbyteArray)env->CallObjectMethod(jstr, mid, strencode);
jsize alen = env->GetArrayLength(barr);
jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);
if (alen > )
{
rtn = (char*)malloc(alen + );
memcpy(rtn, ba, alen);
rtn[alen] = ;
}
env->ReleaseByteArrayElements(barr, ba, );
std::string stemp(rtn);
free(rtn);
return stemp;
} // 实现native方法
JNIEXPORT jstring JNICALL Java_com_dtk_Rec_RecImage(JNIEnv *env, jobject, jstring jstr_input)
{
string imgPath = jstring2str(env, jstr_input);
Mat img = imread(imgPath);
imshow("img",img);
//waitKey();
//destroyAllWindows(); string str = "ABCD";
return env->NewStringUTF(str.c_str());
}
  • 这样就可以用java调用了,首先需要加载库,然后进行调用测试,代码如下:
  • package com.dtk;
    
    public class Rec {
    
        public native String RecImage(String src);
    static {
    System.load("D:/XieXiaoWen/VS-Pro/JniRecDll/bin/JniRecDll.dll");
    } public static void main(String[] args) { long startTime = System.currentTimeMillis(); // 获取开始时间 Rec nativeCode = new Rec();
    String result = nativeCode.RecImage("C:/lena.jpg");
    System.out.println(result);
    System.out.println("JNI成功调用dll!!!"); long endTime = System.currentTimeMillis(); // 获取结束时间
    System.out.println("程序运行时间: " + (endTime - startTime) + "ms");
    }
    }

    完成

java jni 调用c++ opencv代码成功范例的更多相关文章

  1. Java JNI调用c语言的dll测试

    最近复习C语言和java语言(10年没用了,温习一下),用JNI调用C语言的dll测试,以前没做过,在网上找了很多,总结如下: 环境:windows 10(64位) + JDK(32位,版本1.7.0 ...

  2. java jni 调用c语言函数

    今日在hibernate源代码中遇到了native关键词,甚是陌生,就查了点资料,对native是什么东西有了那么一点了解,并做一小记. native关键字说明其修饰的方法是一个原生态方法,方法对应的 ...

  3. code::Blocks生成的dll 在 java jni 调用遇到的问题

    Test.java__________________________________ public class Test{    public static native void p(); pub ...

  4. java jni调用

    http://www.cnblogs.com/mandroid/archive/2011/06/15/2081093.html

  5. Android(安卓)开发通过NDK调用JNI,使用opencv做本地c++代码开发配置方法 边缘检测 范例代码

    以前写过两个Android开发配置文档,使用NDK进行JNI开发,这样能够利用以前已经写好的C++代码. 前两篇博客地址: http://blog.csdn.net/watkinsong/articl ...

  6. Android Jni 调用

    Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 Chap 3:javah命令帮助信息... 16 Chap 4:用javah产生一个.h文件... 17 Chap5:j ...

  7. java中调用kettle转换文件

    java中调用kettle转换文件 通过命令行也能够调用,然后java中调用命令行代码也能够.这样没有和java代码逻辑无缝集成.本文说明kettle5.1中假设通过其它API和java代码无缝集成: ...

  8. [转]Android通过NDK调用JNI,使用opencv做本地c++代码开发配置方法

    原文地址:http://blog.csdn.net/watkinsong/article/details/9849973 有一种方式不需要自己配置所有的Sun JDK, Android SDK以及ND ...

  9. 1.JAVA中使用JNI调用C++代码学习笔记

    Java 之JNI编程1.什么是JNI? JNI:(Java Natibe Inetrface)缩写. 2.为什么要学习JNI?  Java 是跨平台的语言,但是在有些时候仍然是有需要调用本地代码 ( ...

随机推荐

  1. SQL基础日期函数

    --dateadd 将制定的数值添加到指定的日期部分后的日期 select dateadd(mm,4,'01/01/99') -- 返回:以当前的日期格式返回05/01/99 --datediff 二 ...

  2. 数据结构(C语言)关于查找与排序

    1)利用readData()函数从data1.txt中读入不同规模的数据存入数组,编写基于数组的顺序查找算法,测试数据量为1万.5万.10万.20万.30万.40万和50万时的数据查询时间. 算法代码 ...

  3. 一种简单的hook方法--LD_PRELOAD变量

    LD_PRELOAD这个变量允许你定义在程序运行时优先加载的动态链接库,从而在程序运行时的动态链接 下面程序的看一个例子-getuid.c //getuid.c #include<stdio.h ...

  4. L240

    Giant rocks from space are falling from the sky more than they used to, but don't worry. For the pas ...

  5. SQL之join

    QL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据. 有时为了得到完整的结果,我们需要从两个或更多的表中获取结果.我们就需要执行 join. 数据库中的表可通过键将彼此联系起来. ...

  6. Python 字符串的相关操作

    s = "abcdefg" s1 = s.capitalize() # 把首字母变成大写, 返回给你一个新的字符串 print(s) print(s1) s = "ale ...

  7. HDU 3364

    http://acm.hdu.edu.cn/showproblem.php?pid=3364 经典高斯消元解开关问题 m个开关控制n个灯,开始灯全灭,问到达目标状态有几种方法(每个开关至多一次操作,不 ...

  8. HDU 4585

    http://acm.hdu.edu.cn/showproblem.php?pid=4585 从原来的人中找出战斗数值最接近的,输出他们两人的序号 要在logn的复杂度完成查找,我用的是set,当然用 ...

  9. MySQL性能优化方法一:缓存参数优化

    原文链接:http://isky000.com/database/mysql-perfornamce-tuning-cache-parameter 数据库属于 IO 密集型的应用程序,其主要职责就是数 ...

  10. pycharm中tensorflow代码不能自动补全或import红线问题解决

    正确安装并配置好pycharm+tensorflow环境之后,可能在pycharm中导入tensorflow会有以下问题: 1. " import tensorflow as tf &quo ...