java jni 調用c++ opencv代碼成功範例

  • 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.hjava

/* 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 > 0)
    {
        rtn = (char*)malloc(alen + 1);
        memcpy(rtn, ba, alen);
        rtn[alen] = 0;
    }
    env->ReleaseByteArrayElements(barr, ba, 0);
    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");
        }
    }

    完成測試

相關文章
相關標籤/搜索