我尝试过为简单的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
,但仍无法正常工作......
任何其他解决方案??????
答案 0 :(得分:2)
问题在于包名称将您的应用包com.hosa
更改为com_pes_edgejava
。
在您的JNI文件中,您将看到函数(主要)声明,如JNIEXPORT jint JNICALL Java_com_pes_edgejava_main()
Java _ com_pes_edgejava
_ main
那是你的问题。
答案 1 :(得分:0)
hotveryspicy指出了明显的问题(即当你应该有com_hosa时你有com_pes)。至于它不起作用的事实,我怀疑这归结为“使用命名空间cv”。因此,您在cv命名空间内声明了JNI函数,这是不正确的。这是use关键字需要警惕的原因之一。
将cv ::放在对函数的调用和该命名空间中的结构/类的定义之前,有什么不对?无论如何,它在自我记录方面要好得多。