2012-04-13 70 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的定义之前是什么错误?无论如何,它在自我记录方面要好得多。