2012-04-13 64 views
1

我已經嘗試寫簡單的c代碼的jni調用。當我嘗試在運行2.3.3的電話上安裝它時,它不安裝,有時即使它安裝,然後它正在強制關閉。請幫助我。代碼詳細信息如下:Android的JNI電話

我生成頭文件的java代碼。

package com.hosa; 

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

}

生成的頭文件是如下

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

本機函數的實現如下

#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科幻樂

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_pes_edgejavacom_hosa_edgejava_main,但仍然沒有工作...

任何其他解決方案??????

+0

當您的應用程序被強制關閉時,Android日誌會說什麼?也許一些崩潰消息來幫助調試情況? – gfour 2012-04-13 23:22:10

+0

StackOverflow不是論壇;我們期望*的回答實際上回答了問題*。如果您需要與其他用戶進行互動,您可以在他們的答案上留下評論。當你打到50代表時,你將能夠在任何地方留下評論。如果你需要添加細節,你可以[編輯]你的問題。對於其他所有問題,請參閱我們的[faq]或訪問[meta],我們將討論StackOverflow。 – Will 2012-04-16 15:43:11

+0

@Gaurav:不要編輯人的答案來添加您的問題。編輯您的原始問題或發表評論到他們的問題。 – Goz 2012-04-17 11:47:50

回答

2

問題在於你包名將您的應用程序包com.hosa更改爲com_pes_edgejava

在你的JNI文件,你會看到這樣JNIEXPORT jint JNICALL Java_com_pes_edgejava_main功能(主)聲明()

JAVA_ com_pes_edgejava _main

那是你的問題。

0

hotveryspicy指出了一個明顯的問題(即當你有com_hosa時你有com_pes)。至於它不起作用,我會懷疑這歸結於「using namespace cv」。因此你在CV命名空間中聲明瞭你的JNI函數,這是不正確的。這是使用關鍵字需要謹慎的原因之一。

把cv ::放在函數調用和該命名空間中的structs/classes的定義之前是什麼錯誤?無論如何,它在自我記錄方面要好得多。