A
Agassiz
Neues Mitglied
- 7
Hallo zusammen,
ich hoffe mir kann jemand helfen.
Ich habe einem Tutorial erfolgreich eine Testapp erstellt.
Nun wollte ich die C++ Datei im JNI Ordner um eine Methode erweitern.
Folgendes ist meine C++ Datei (jni_part.cpp):
Dazu will ich eine simple Funktion reinschreiben die mir eine 5 als Ausgabe zurückgibt nur zu Testzwecken:
Die schreibe ich einfach in den "extern C" part hinein richtig?
In dem Java Part definiere ich die Funktion auch einmal neben der schon vorhandenen "convertNativeGray" - die ohne weiteres funktioniert:
und rufe printString(); am ende von onCreate auf indem ich eine ausgabe in die logdatei schreibe:
===
Bis hierhin ist doch alles richtig oder?
- jetzt rufe ich ndk-build.cmd in dem root verzeichnis der app auf - das läuft auch sauber durch - bzw keine warnungen oder errors.
Allerings schreit LogCat nun und sagt, dass die Native methode nicht gefunden wurde - 06-23 15:24:09.437: java.lang.UnsatisfiedLinkError: Native method not found: com.example.myapp.Opencvpart.printString
)
Wo liegt der Fehler? Was mache ich falsch?
ich hoffe mir kann jemand helfen.
Ich habe einem Tutorial erfolgreich eine Testapp erstellt.
Nun wollte ich die C++ Datei im JNI Ordner um eine Methode erweitern.
Folgendes ist meine C++ Datei (jni_part.cpp):
Code:
#include <jni.h>
#include "opencv2/core/core.hpp"
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <stdio.h>
using namespace std;
using namespace cv;
int toGray(Mat img, Mat& gray);
extern "C" {
JNIEXPORT jint JNICALL Java_com_example_myapp_Opencvpart_convertNativeGray(JNIEnv*, jobject, jlong addrRgba, jlong addrGray);
JNIEXPORT jint JNICALL Java_com_example_myapp_Opencvpart_convertNativeGray(JNIEnv*, jobject, jlong addrRgba, jlong addrGray) {
Mat& mRgb = *(Mat*)addrRgba;
Mat& mGray = *(Mat*)addrGray;
int conv;
jint retVal;
conv = toGray(mRgb, mGray);
retVal = (jint)conv;
return retVal;
}
}
int toGray(Mat img, Mat& gray)
{
cvtColor(img, gray, CV_RGBA2GRAY); // Assuming RGBA input
if (gray.rows == img.rows && gray.cols == img.cols)
{
return (1);
}
return(0);
}
Dazu will ich eine simple Funktion reinschreiben die mir eine 5 als Ausgabe zurückgibt nur zu Testzwecken:
Code:
JNIEXPORT jint JNICALL Java_com_example_myapp_Opencvpart_printString(JNIEnv*, jobject);
JNIEXPORT jint JNICALL Java_com_example_myapp_Opencvpart_printString(JNIEnv*, jobject) {
return 5;
}
Die schreibe ich einfach in den "extern C" part hinein richtig?
Code:
extern "C" {
JNIEXPORT jint JNICALL Java_com_example_myapp_Opencvpart_printString(JNIEnv*, jobject);
JNIEXPORT jint JNICALL Java_com_example_myapp_Opencvpart_printString(JNIEnv*, jobject) {
return 5;
}
JNIEXPORT jint JNICALL Java_com_example_myapp_Opencvpart_convertNativeGray(JNIEnv*, jobject, jlong addrRgba, jlong addrGray);
JNIEXPORT jint JNICALL Java_com_example_myapp_Opencvpart_convertNativeGray(JNIEnv*, jobject, jlong addrRgba, jlong addrGray) {
Mat& mRgb = *(Mat*)addrRgba;
Mat& mGray = *(Mat*)addrGray;
int conv;
jint retVal;
conv = toGray(mRgb, mGray);
retVal = (jint)conv;
return retVal;
}
}
In dem Java Part definiere ich die Funktion auch einmal neben der schon vorhandenen "convertNativeGray" - die ohne weiteres funktioniert:
Code:
public native int printString();
public native int convertNativeGray(long matAddrRgba, long matAddrGray);
und rufe printString(); am ende von onCreate auf indem ich eine ausgabe in die logdatei schreibe:
Code:
Log.v("MYJNI", printString()+"");
===
Bis hierhin ist doch alles richtig oder?
- jetzt rufe ich ndk-build.cmd in dem root verzeichnis der app auf - das läuft auch sauber durch - bzw keine warnungen oder errors.
Allerings schreit LogCat nun und sagt, dass die Native methode nicht gefunden wurde - 06-23 15:24:09.437: java.lang.UnsatisfiedLinkError: Native method not found: com.example.myapp.Opencvpart.printString

Wo liegt der Fehler? Was mache ich falsch?