Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用本机android运行但不显示结果的程序_Java_Android_Eclipse_Android Ndk_Java Native Interface - Fatal编程技术网

Java 使用本机android运行但不显示结果的程序

Java 使用本机android运行但不显示结果的程序,java,android,eclipse,android-ndk,java-native-interface,Java,Android,Eclipse,Android Ndk,Java Native Interface,这是我的jni文件,native.cpp extern "C" Java_org_opencv_samples_NativeActivity_CvNativeActivity_CannyJNI( JNIEnv* env, jobject thiz, jint height, jint width, jintArray in, jintArray out) { //get the data pointer. jint* _in = env-

这是我的jni文件,
native.cpp

    extern "C"
 Java_org_opencv_samples_NativeActivity_CvNativeActivity_CannyJNI(
        JNIEnv* env, jobject thiz,
        jint height, jint width, jintArray in, jintArray out)
{
    //get the data pointer.
    jint* _in = env->GetIntArrayElements(in, 0);
    jint* _out = env->GetIntArrayElements(out, 0);


    //Build the Mat structure for input data
    Mat mSrc(height, width, CV_8UC4, (unsigned char *)_in);
    //Build the Mat structure for output data
    Mat bgr(height, width, CV_8UC4, (unsigned char *)_out);

    //Convert Mat to IplImage
    IplImage mSrcImg = mSrc;
    IplImage mOutImg = bgr;

    //Create the gray image for input data.
    IplImage * mSrcGrayImg = cvCreateImage(cvGetSize(&mSrcImg), mSrcImg.depth, 1);
    IplImage * mOutGrayImg = cvCreateImage(cvGetSize(&mSrcImg), mSrcImg.depth, 1);

    IplImage *b,*g,*r;
    b = cvCreateImage( cvGetSize(mSrcGrayImg), 8, 1 );
    g = cvCreateImage( cvGetSize(mSrcGrayImg), 8, 1 );
    r = cvCreateImage( cvGetSize(mSrcGrayImg), 8, 1 ) ;

    cvSplit(&mSrcImg, b, g, r, 0 );
    cvEqualizeHist( b, b );
    cvEqualizeHist( g, g );
    cvEqualizeHist( r, r );
    cvMerge(b,g,r,0,&mOutImg);
    //release the pointer.
    env->ReleaseIntArrayElements(in, _in, 0);
    env->ReleaseIntArrayElements(out, _out, 0);
    return true;
}
当我添加这两行时,我的每个jni部分都为我工作

cvCvtColor(mOutGrayImg, mSrcGrayImg, CV_BGR2YCrCb);
cvCvtColor(mSrcGrayImg, &mOutImg , CV_YCrCb2BGR);
就像我添加时上面的代码一样

cvMerge(b,g,r,0,mOutGrayImg);
cvCvtColor(mOutGrayImg, mSrcGrayImg, CV_BGR2YCrCb);
cvCvtColor(mSrcGrayImg, &mOutImg , CV_YCrCb2BGR);
它运行,和我的其他代码一样,谁能告诉我
为什么以及如何运行?我如何摆脱这两行代码,并简单地
cvMerge(b,g,r,0,mOutGrayImg)该行发送输出图像,以及如何设置此代码的C++接口。< /P>
这是我的jave文件contain
CvNativeActivity.java

public class CvNativeActivity extends Activity implements CvCameraViewListener2
{   
    public native boolean BrightnessJNI(int width, int height, int [] mPhotoIntArray, int [] mCannyOutArray);

    static 
    {
        System.loadLibrary("native_activity");
    }
    /** Called when the activity is first created. */ 
    ImageView imageview_1;
    ImageView imageview_2;
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
         imageview_1=(ImageView) findViewById(R.id.imageView1);
         imageview_2=(ImageView) findViewById(R.id.imageView2);

        InputStream is;
        is = this.getResources().openRawResource(R.drawable.foot);
        Bitmap bmInImg = BitmapFactory.decodeStream(is);

        int [] mPhotoIntArray;
        int [] mCannyOutArray;

        mPhotoIntArray = new int[bmInImg.getWidth() * bmInImg.getHeight()];
        // Copy pixel data from the Bitmap into the 'intArray' array
        bmInImg.getPixels(mPhotoIntArray, 0, bmInImg.getWidth(), 0, 0, bmInImg.getWidth(), bmInImg.getHeight());

        //create the Brightness result buffer
        mCannyOutArray = new int[bmInImg.getWidth() * bmInImg.getHeight()];

        //
        // Do Brightness
        //
        BrightnessJNI(bmInImg.getHeight(), bmInImg.getWidth(), mPhotoIntArray, mCannyOutArray);

        //
        // Convert the result to Bitmap
        //
        Bitmap bmOutImg = Bitmap.createBitmap(bmInImg.getWidth(), bmInImg.getHeight(), Config.ARGB_8888);  
        bmOutImg.setPixels(mCannyOutArray, 0, bmInImg.getWidth(), 0, 0, bmInImg.getWidth(), bmInImg.getHeight());


        imageview_2.setImageBitmap(bmOutImg);

        //
        // Save the result to file
        //
        String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
        String outFileName = extStorageDirectory + "/Brightness";

        OutputBitmapToFile(bmOutImg, outFileName);





    }

    void OutputBitmapToFile(Bitmap InBm, String Filename)
    {
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        InBm.compress(Bitmap.CompressFormat.PNG, 100, bytes);

        File f = new File(Filename);
        try
        {
            f.createNewFile();
            //write the bytes in file
            FileOutputStream fo = new FileOutputStream(f);
            fo.write(bytes.toByteArray());
        } 
        catch (Exception e) 
        {
            e.printStackTrace();
        }           
    }
}

谢谢

嗯,我找到了问题所在。它没有显示图像,因为您在
cvMerge
中将
alpha通道
设置为0。位图为RGBA格式。α是0。因此,完整的黑色图像

下面是C API实现代码。这很有效

#include <jni.h>
#include <stdio.h>
#include "opencv2/core/core.hpp"
#include <opencv2/imgproc/imgproc_c.h>

using namespace std;
using namespace cv;

extern "C"
{
    JNIEXPORT jint JNICALL 
    Java_com_fenchtose_equalizehist_EqActivity_eqhist(
            JNIEnv* env, jobject,
            jint width, jint height, jintArray in, jintArray out)
    {
        jint* _in = env->GetIntArrayElements(in, 0);
        jint* _out = env->GetIntArrayElements(out, 0);

        Mat mSrc(height, width, CV_8UC4, (unsigned char*)_in);
        Mat bgra(height, width, CV_8UC4, (unsigned char*)_out);

        IplImage mSrcImg = mSrc;
        IplImage mOutImg = bgra;

        IplImage *b, *g, *r, *a;

        b = cvCreateImage(cvSize(width, height), mSrcImg.depth, 1);
        g = cvCreateImage(cvSize(width, height), mSrcImg.depth, 1);
        r = cvCreateImage(cvSize(width, height), mSrcImg.depth, 1);
        a = cvCreateImage(cvSize(width, height), mSrcImg.depth, 1);

        cvSplit(&mSrcImg, b, g, r, a);
        cvEqualizeHist(b, b);
        cvEqualizeHist(g, g);
        cvEqualizeHist(r, r);

        cvMerge(b, g, r, a, &mOutImg); // merge alpha layer too
        jint retVal;
        int ret = 1;
        retVal = jint(retVal);

        env->ReleaseIntArrayElements(in, _in, 0);
        env->ReleaseIntArrayElements(out, _out, 0);

        return retVal;


    }
}

这是正常工作的。< /P>在OpenCV C++功能上,如<代码>拆分、合并、MycPy < /代码>,它不能显示错误,我们可以使用JNI的完全C++接口吗?是的。你当然可以使用JNI的C++接口。您正在使用外部“C”。并尝试包含适当的标题

memcpy
不是opencv函数。你应该发布你收到的错误。我更新了我的问题,如果你解释bit,我将为此奖励奖金,thanks@Ahmad这是C++接口。您得到的代码可能来自示例MyRealTimeImageProcessing。我只是在猜。无论如何,设置C++接口没有什么可做的。只要开始使用它。当您将Mat地址从Java传递到本机时,它也会有所帮助。C和C++接口都有相同的Android.mk和Apple .MK文件。@艾哈迈德,我已经更新了答案并找到了问题。
#include <jni.h>
#include <stdio.h>
#include "opencv2/core/core.hpp"
#include <opencv2/imgproc/imgproc.hpp>
#include <vector>

using namespace std;
using namespace cv;

extern "C"
{
    JNIEXPORT jint JNICALL 
    Java_com_example_equalizehist_EqActivity_eqhist(
            JNIEnv* env, jobject,
            jint width, jint height, jintArray in, jintArray out)
    {
        jint* _in = env->GetIntArrayElements(in, 0);
        jint* _out = env->GetIntArrayElements(out, 0);

        Mat mSrc(height, width, CV_8UC4, (unsigned char*)_in);
        Mat bgra(height, width, CV_8UC4);

        vector<Mat> sChannels;
        split(mSrc, sChannels);

        for(int i=0; i<sChannels.size(); i++)
        {
            equalizeHist(sChannels[i], sChannels[i]);
        }

        merge(sChannels, bgra);

        for(int i=0; i<height; i++)
        {
            memcpy(&(_out[i*width]), &(bgra.data[i*bgra.step]), width*bgra.channels());
        }

        env->ReleaseIntArrayElements(in, _in, 0);
        env->ReleaseIntArrayElements(out, _out, 0);

        jint retVal;
        int ret = 1;
        retVal = jint(retVal);
        return retVal;
    }
}
#include <jni.h>
#include <stdio.h>
#include "opencv2/core/core.hpp"
#include <opencv2/imgproc/imgproc.hpp>
#include <vector>

using namespace std;
using namespace cv;

extern "C"
{
    JNIEXPORT jint JNICALL 
    Java_com_example_equalizehist_EqActivity_eqhist(
            JNIEnv* env, jobject,
            jint width, jint height, jintArray in, jintArray out)
    {
        jint* _in = env->GetIntArrayElements(in, 0);
        jint* _out = env->GetIntArrayElements(out, 0);

        Mat mSrc(height, width, CV_8UC4, (unsigned char*)_in);
        Mat bgra(height, width, CV_8UC4, (unsigned char*)_out);

        vector<Mat> sChannels;
        split(mSrc, sChannels);

        for(int i=0; i<sChannels.size(); i++)
        {
            equalizeHist(sChannels[i], sChannels[i]);
        }

        merge(sChannels, bgra);
        env->ReleaseIntArrayElements(in, _in, 0);
        env->ReleaseIntArrayElements(out, _out, 0);

        jint retVal;
        int ret = 1;
        retVal = jint(retVal);
        return retVal;
    }
}