Android Native Entwicklung (JNI)

  • 2 Antworten
  • Letztes Antwortdatum
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):

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?
 
Hi,

ich bin eher C-Programmierer, als dass ich bisher Android-Libs per C geschrieben hätte, daher nur eine Idee, die gerne mal passiert.

Eventuell wurde deine Compilierte Datei nicht erneuert.
Du könntest im Projekt mal die alten Compilierungen löschen (.o) und nun das C-Projekt neu binden.

Nun schauen was LogCat sagt.


Meine Vermutung ist, dass dein Projekt nicht vollständig neu Kompiliert wird.

EDIT:

Der ursprüngliche Beitrag von 09:39 Uhr wurde um 10:08 Uhr ergänzt:

Übrigens...

Deine Funktion printString() sollte als printString(void) deklariert werden. (FKT ohne Parameter)


bzw hier:
JNIEXPORT jint JNICALL Java_com_example_myapp_Opencvpart_printString(JNIEnv*, jobject);

mit:

JNIEXPORT jint JNICALL Java_com_example_myapp_Opencvpart_printString(JNIEnv*, jobject, void);

kannst du ja mal probieren. Weil Fkt() heisst in C, dass die Fkt beliebig viele Parameter besitzen kann.

Warum proggst du eigendlich mit C?


Beste Grüsse
 
Hallo Agassiz,

mich würde interessieren ob du nun weitergekommen bist. Die Lösung sollte ich dir ja gegeben haben.
Oder ist dein Vorhaben jetzt beendet?

Beste Grüsse
 

Ähnliche Themen

M
Antworten
21
Aufrufe
1.360
swa00
swa00
Mr-Fisch
Antworten
5
Aufrufe
964
migi01
migi01
Mr-Fisch
Antworten
8
Aufrufe
1.006
Mr-Fisch
Mr-Fisch
M
Antworten
9
Aufrufe
789
mkuz24
M
A
Antworten
5
Aufrufe
692
swa00
swa00
Zurück
Oben Unten