2012-04-13 7 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以下のようになるように生成されたヘッダファイルであります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_pes_edgejava

... com_hosa_edgejava_mainにまだ働いていない任意の他のソリューションを変更しました??????

+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を持っています)。それはまだ動作しないという事実に関しては、私はこれが "using namespace cv"になると思うでしょう。結果として、正しくないcv名前空間内でJNI関数を宣言しています。これは、キーワードを使用することが慎重である理由の1つです。

関数とその名前空間にある構造体/クラスの定義の呼び出しの前にcv ::を置くだけで何が問題になりますか?とにかくその方法を文書化することではるかに優れています。