安卓JNI调用

标签 android android-ndk java-native-interface

我已经尝试为简单的 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

native函数的实现如下

#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)

应用程序.mk

 APP_MODULES      := edgejava
 APP_STL := gnustl_static
 APP_CPPFLAGS := -frtti -fexceptions

Activity 文件如下

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);
}

已对 list 进行所有必要的更改,例如提及使用相机和设置权限。

编辑: 我已将 com_pes_edgejava 更改为 com_hosa_edgejava_main 但仍然无法正常工作...

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

最佳答案

问题出在你的 Packname 将你的应用程序包 com.hosa 更改为 com_pes_edgejava

在您的 JNI 文件中,您将看到像 JNIEXPORT jint JNICALL Java_com_pes_edgejava_main() 这样的函数(主)声明

Java_com_pes_edgejava_main

那是你的问题。

关于安卓JNI调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10136932/

相关文章:

java - 从特定 USB 端口捕获键盘输入

android - 具有默认值的 EditText

android - 从不工作的android项目中删除所有未使用的资源

java - 为什么以及如何应用阈值来获得更好的匹配特征

android - 我可以在 Android NDK 中使用 ifstream 来访问资源吗?

java - JNI 如何从 cpp 获取 jar 位置

android - 使用 react-native-sensors 的磁力计的平滑方向指南针

java - 从 C++ 创建一个 android.graphics.Bitmap

Android NDK 构建,方法无法解析

java - 如何在 Android 代码中使用 .so 文件来使用本地方法