2012-04-13 3 views
1

간단한 C 코드에 대해 jni 호출을 작성하려고했습니다. 나는 2.3.3을 실행하는 전화에이 파일을 설치하려고 할 때 설치가 안되는 경우가 있는데, 설치 한 후에도 강제로 닫히고 있습니다. 제발 도와주세요. 코드 세부 정보는 다음과 같습니다.Android JNI 호출

헤더 파일을 생성하는 Java 코드입니다. 고유 기능의 구현

#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; 

}

android.mk 아래와 같다

/* 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 

아래로

package com.hosa; 

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

}는

생성 된 헤더 파일은 fi 르

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) 

application.mk

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

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); 
} 

}

매니페스트에 대한 모든 필요한 변경을 사용의 언급처럼 수행 된 다음과 같은 활동 파일입니다 카메라 및 사용 권한이 설정되었습니다.

편집 : 나는 com_hosa_edgejava_maincom_pes_edgejava을 변경하지만 여전히 작동하지 않은 ...

다른 솔루션 ??????

+0

응용 프로그램을 강제 종료 할 때 Android 로그에 표시되는 내용은 무엇입니까? 상황을 디버그하는 데 도움이되는 충돌 메시지일까요? – gfour

+0

StackOverflow는 포럼이 아닙니다. 우리는 * 실제로 대답에 대한 답변을 기대합니다 *. 다른 사용자와 상호 작용해야하는 경우 답변에 댓글을 남길 수 있습니다.50 명의 담당자를 쳤을 때 모든 곳에서 의견을 남길 수 있습니다. 세부 사항을 추가해야하는 경우 질문을 편집 할 수 있습니다. 다른 모든 문제에 대해서는 [faq]를 보거나 [StackOverflow]를 토론하는 [meta]를 방문하십시오. – Will

+0

@ Gaurav : 사람들의 대답을 편집하여 질문을 추가하지 마십시오. 원래 질문을 편집하거나 질문에 대한 의견을 게시하십시오. – Goz

답변

2

문제는 당신에 팩 이름com.hosacom_pes_edgejava로 변경하십시오. 당신의 JNI에서

는 JNIEXPORT jint를 JNICALL Java_com_pes_edgejava_main 같은 기능 (주) 선언()

Java_ com_pes_edgejava 문제의

_main를 볼 수 파일.

0

hotveryspicy는 명백한 문제 (즉, com_hosa가 있어야 할 때 com_pes가 있음)를 지적합니다. 사실 그것이 여전히 작동하지 않는다면, 나는 이것이 "네임 스페이스 CV 사용하기"에 달려 있다고 의심 할 것이다. 결과적으로 올바르지 않은 cv 네임 스페이스 내에서 JNI 함수를 선언하게됩니다. 이것은 using 키워드가주의해야 할 이유 중 하나입니다.

그냥 네임 스페이스에있는 structs/classes의 함수와 정의에 대한 호출 앞에 cv ::를 끼워 넣는 것이 잘못된 것일까 요? 어쨌든 그 방법을 문서화하는 것이 훨씬 좋습니다.

관련 문제