2014-09-25 3 views
1

Привет всем Я работаю над некоторым кодом Java, который вызывает функции из dll C++. Но некоторые функции из dll можно назвать правильно, а другие не могут. Сначала я написал класс java, который переносит все функции из dll, а затем используя javah сгенерирует соответствующий заголовочный файл jni. Наконец, я пишу код C++, включая сгенерированный заголовочный файл jni. Файл C++ был написан в Visual Studio, а код Java был написан в Eclipse.jni native метод проблемы

Ниже мой код, я удалил какой-то нерелевантный код.

Java:

public class VideoDetecion { 
    static { 

     System.load("dll_video_detect.dll"); 
     System.load("vd_jni_impl.dll"); 
    } 

    public static native int getFrame(String videoName, int second,String frameName); 
    public static native int getFrame1(String videoName); 
    public static native int getFrame2(String videoName, int second); 
} 

C++

using cv::VideoCapture; 
using cv::Mat; 
using std::string; 
using std::bind; 
using std::shared_ptr; 
using std::vector; 
using std::string; 

using namespace std::placeholders; 


JNIEXPORT jint JNICALL Java_videoDetectionJNI_VideoDetecion_getFrame1 
(JNIEnv *env, jclass, jstring videoName) 
{ 
    //String videoName = "D:\\videos\\detect1\\0.mp4"; 
    shared_ptr<const char> vn(env->GetStringUTFChars(videoName, NULL), bind(&JNIEnv::ReleaseStringUTFChars, env, videoName, _1)); 

    int second = 10; 
    string frameName = "D:\\videos\\detect1\\0-10.jpg"; 

    vd::getVideoFrame(string(vn.get()), second, frameName); 
    return 0; 
} 

/* 
* Class:  videoDetectionJNI_VideoDetecion 
* Method: getFrame2 
* Signature: (Ljava/lang/String;I)I 
*/ 
JNIEXPORT jint JNICALL Java_videoDetectionJNI_VideoDetecion_getFrame2 
(JNIEnv *env, jclass, jstring videoName, jint second) 
{ 
    shared_ptr<const char> vn(env->GetStringUTFChars(videoName, NULL), bind(&JNIEnv::ReleaseStringUTFChars, env, videoName, _1)); 


    string frameName = "D:\\videos\\detect1\\0-10.jpg"; 

    vd::getVideoFrame(string(vn.get()), second, frameName); 
    return 0; 
} 



JNIEXPORT jint JNICALL Java_videoDetectionJNI_VideoDetecion_getFrame 
(JNIEnv *env, jobject, jstring videoName, jint second, jstring frameName) 
{ 
    shared_ptr<const char> vn(env->GetStringUTFChars(videoName, NULL), bind(&JNIEnv::ReleaseStringUTFChars,env, videoName,_1)); 
    shared_ptr<const char> fn(env->GetStringUTFChars(frameName, NULL), bind(&JNIEnv::ReleaseStringUTFChars,env,frameName,_1)); 


    if (videoName == NULL || frameName==NULL) 
    { 
     return -1; 
    } 

    vd::getVideoFrame(string(vn.get()), second, string(fn.get())); 

    return 0; 
} 

Сообщение об ошибке от затмения было: Исключение в потоке "главный" java.lang.UnsatisfiedLinkError: videoDetectionJNI.VideoDetecion.getFrame (Ljava/языки/String; ILjava/lang/String;) I at videoDetectionJNI.VideoDetecion.getFrame (собственный метод) at videoDetectionJNI.Test.main (Test.java:48)

то, что делает меня несчастным, заключается в том, что метод getFrame1 и getFrame2 работает правильно, но реального метода getFrame, который я хочу, нет.

Кроме того, когда я использую Visual Studio для присоединения к процессу java.exe для отладки программы, программа может остановиться на точке останова в функции getFrame1 и getFrame2 в cpp-файле, но не остановится на контрольной точке в функции getFrame ,

Может мне помочь? Это действительно меня смущает.

пс. Я новичок в java.

+0

Что делает 'dumpbin/exports vd_jni_impl.dll'? то есть символы, которые, по вашему мнению, экспортируются на самом деле экспортированы? Во-вторых, вы повторно запустили 'javah', потому что подпись последней функции не соответствует тому, что происходит от ее запуска против файла .java (даже если он помещен в пакет' videoDetectionJNI'). – Petesh

+0

5 4 00001221 Java_videoDetectionJNI_VideoDetecion_getFrame0 = @ ILT + 540 (Java_videoDetectionJNI_VideoDetecion_getFrame0) 6 5 00001226 Java_videoDetectionJNI_VideoDetecion_getFrame1 = @ ILT + 545 (Java_videoDetectionJNI_VideoDetecion_getFrame1) 7 6 000Java_videoDetectionJNI_VideoDetecion_getFrame2 = @ ILT + 555 (Java_videoDetectionJNI_VideoDetecion_getFrame2) –

+0

три функции все экспортируется. Я запустил javah (через Eclipse), и файл заголовка новейший –

ответ

2

Ваш Java подпись

public static native int getFrame(String videoName, int second,String frameName); 

не совпадает с C++ подпись реализации.

JNIEXPORT jint JNICALL Java_videoDetectionJNI_VideoDetecion_getFrame 
(JNIEnv *env, jobject, jstring videoName, jint second, jstring frameName) 

Либо изменить Java подпись быть не статичным, или изменить второй параметр Вашего C++ реализации подписи JClass от jobject.

Смежные вопросы