2012-04-13 14 views
1

Ich habe versucht, einen jni Anruf für den einfachen c-Code schreiben. wenn ich versuche, dieses auf dem Telefon zu installieren, das 2.3.3 läuft, installiert es nicht, manchmal sogar, wenn es dann installiert wird, wird er Kraft geschlossen. Bitte helfen Sie mir damit. Die Codedetails lauten wie folgt:Android JNI Anruf

Der Java-Code von dem ich die Header-Datei generieren.

package com.hosa; 

public class edgejava 
{ 
static{ 
    System.loadLibrary("edgejava"); 
} 
public native int main(); 

}

die erzeugte Header-Datei ist als unten

/* DO NOT EDIT THIS FILE - it is machine generated */ 
#include <jni.h> 
/* Header for class com_hosa_edgejava */ 

#ifndef _Included_com_hosa_edgejava 
#define _Included_com_hosa_edgejava 
#ifdef __cplusplus 
extern "C" { 
#endif 
/* 
    * Class:  com_hosa_edgejava 
    * Method: main 
    * Signature:()I 
    */ 
    JNIEXPORT jint JNICALL Java_com_hosa_edgejava_main 
    (JNIEnv *, jobject); 

#ifdef __cplusplus 
} 
#endif 
#endif 

die Implementierung von native Funktion ist als unten

#include "com_hosa_edgejava.h" 
#include <jni.h> 
#include <cv.h> 
#include <highgui.h> 

using namespace cv; 

JNIEXPORT jint JNICALL Java_com_pes_edgejava_main(JNIEnv *, jobject){ 
VideoCapture cap(0); // open the default camera 
if(!cap.isOpened()) // check if we succeeded 
    return -1; 

Mat edges; 
namedWindow("edges",CV_WINDOW_AUTOSIZE); 
for(;;) 
{ 
    Mat frame; 
    cap >> frame; // get a new frame from camera 
    cvtColor(frame, edges, CV_BGR2GRAY); 
    GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5); 
    Canny(edges, edges, 0, 30, 3); 
    imshow("edges", edges); 
    if(waitKey(30) >= 0) break; 
} 
// the camera will be deinitialized automatically in VideoCapture destructor 
return 0; 

}

die android.mk fi

le
LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

include /home/srijith/android-opencv/OpenCV-2.3.1/share/OpenCV/OpenCV.mk 

LOCAL_MODULE := edgejava 
LOCAL_SRC_FILES := edgecpp.cpp 
LOCAL_LDLIBS += -llog -ldl 


include $(BUILD_SHARED_LIBRARY) 

die application.mk

APP_MODULES  := edgejava 
APP_STL := gnustl_static 
APP_CPPFLAGS := -frtti -fexceptions 

die Aktivitätsdatei ist wie folgt

package com.hosa; 

import android.app.Activity; 
import android.os.Bundle; 

public class Andedge2Activity extends Activity { 
edgejava nativelib; 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    nativelib= new edgejava(); 
    int i=nativelib.main(); 
    System.out.println("value returned to andedgeactivity "+i); 
} 

}

Alle notwendigen Änderungen an den manifesten hat wie erwähnt Gebrauch gemacht worden, von Kamera und Berechtigungen wurde festgelegt.

bearbeiten: Ich habe die com_pes_edgejava-com_hosa_edgejava_main geändert, aber immer noch nicht funktioniert ...

Alle anderen Lösungen ??????

+0

Was sagt das Android Log, wenn Ihre Anwendung geschlossen werden muss? Vielleicht eine Fehlermeldung, um die Situation zu debuggen? – gfour

+0

StackOverflow ist kein Forum; wir erwarten Antworten auf * beantworten tatsächlich die Frage *. Wenn Sie mit anderen Benutzern interagieren müssen, können Sie Kommentare zu ihren Antworten hinterlassen.Wenn Sie 50 Wiederholungen drücken, können Sie überall Kommentare hinterlassen. Wenn Sie Details hinzufügen müssen, können Sie Ihre Frage bearbeiten. Für alle anderen Angelegenheiten, lesen Sie bitte unsere [faq] oder besuchen Sie [meta], wo wir StackOverflow diskutieren. – Will

+0

@Gaurav: Bearbeiten Sie die Antworten der Personen nicht, um Ihre Fragen hinzuzufügen. Bearbeiten Sie Ihre ursprüngliche Frage oder schreiben Sie einen Kommentar zu ihrer Frage. – Goz

Antwort

2

Problem ist in Ihnen Packname Ändern Sie Ihr Anwendungspaket com.hosa zu com_pes_edgejava.

In Ihrer JNI-Datei Sie Funktion (Haupt-) Erklärung wie JNIEXPORT JINT JNICALL Java_com_pes_edgejava_main()

java_ com_pes_edgejava _main

Das ist Ihr Problem sehen.

0

hotveryspicy weist auf das offensichtliche Problem hin (dh dass Sie com_pes haben, wenn Sie com_hosa haben sollten). Was die Tatsache angeht, dass es immer noch nicht funktioniert, würde ich vermuten, dass dies auf den "using namespace cv" zurückzuführen ist. Als Ergebnis deklarieren Sie Ihre JNI-Funktion im cv-Namespace, die nicht korrekt ist. Dies ist einer der Gründe, warum das using-Schlüsselwort etwas ist, vor dem man sich hüten sollte.

was ist falsch mit nur setzen cv :: vor den Aufrufen von Funktionen und Definitionen von Strukturen/Klassen, die in diesem Namespace sind? Es ist weitaus besser, es auf diese Weise zu dokumentieren.