1

シンプルな c コードの jni 呼び出しを作成してみました。2.3.3 を実行している電話にこれをインストールしようとすると、インストールされません。インストールしても、強制的に閉じられることがあります。これで私を助けてください。コードの詳細は次のとおりです。

ヘッダー ファイルを生成する 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_edgejavaましたcom_hosa_edgejava_mainが、まだ機能していません...

他の解決策??????

4

2 に答える 2

2

問題は、Packnameをアプリケーション パッケージcom.hosaに変更することcom_pes_edgejavaです。

JNI ファイルには、JNIEXPORT jint JNICALL Java_com_pes_edgejava_main() のような関数 (メイン) 宣言が表示されます。

Java_ com_pes_edgejava_main

それはあなたの問題です。

于 2012-04-13T07:40:35.897 に答える
0

hotveryspicyは、明らかな問題を指摘しています(つまり、com_hosaが必要なときにcom_pesがあるということです)。それがまだ機能しないという事実に関しては、これは「名前空間cvの使用」に帰着すると思います。その結果、正しくないcv名前空間内でJNI関数を宣言しています。これが、usingキーワードが注意すべき理由の1つです。

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

于 2012-04-15T08:01:44.243 に答える