将图像从java传递到C++;使用JNI

将图像从java传递到C++;使用JNI,java,android,c++,android-ndk,java-native-interface,Java,Android,C++,Android Ndk,Java Native Interface,我在android应用程序中使用NDK和JNI,因此我有一些本机代码。我有一个自定义适配器,其中有一个显示图像和按钮的列表视图,它来自数据库BTW。但是,图像将被C++使用。如果我点击按钮(从java代码),它会传递(我真的不知道这个词)C++的代码,我会使用图像。C++代码是否可以访问由java代码按钮触发的图像? 我基本上是个初学者,但这是我的最后一个项目,因此任何帮助都将不胜感激:) Adapter.Java @Override public View getView(int positi

我在android应用程序中使用NDK和JNI,因此我有一些本机代码。我有一个自定义适配器,其中有一个显示图像和按钮的列表视图,它来自数据库BTW。但是,图像将被C++使用。如果我点击按钮(从java代码),它会传递(我真的不知道这个词)C++的代码,我会使用图像。C++代码是否可以访问由java代码按钮触发的图像?

我基本上是个初学者,但这是我的最后一个项目,因此任何帮助都将不胜感激:)

Adapter.Java

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    View v = View.inflate(mContext, R.layout.listview, null);
    TextView pName = (TextView) v.findViewById(R.id.product_name);
    ImageView pImage = (ImageView) v.findViewById(R.id.product_image);
    TextView pPrice = (TextView) v.findViewById(R.id.product_price);
    TextView pDescription = (TextView) v.findViewById(R.id.product_description);
    TextView pCategory = (TextView) v.findViewById(R.id.product_category);
    pName.setText(mProductList.get(position).getName());

    Product image = mProductList.get(position);
    final byte[] img = image.getImage();
    Bitmap bitmap = BitmapFactory.decodeByteArray(img, 0, img.length);
    pImage.setImageBitmap(bitmap);

    pPrice.setText("$" + String.valueOf(mProductList.get(position).getPrice()));
    pDescription.setText(mProductList.get(position).getDescription());
    pCategory.setText(mProductList.get(position).getCategory());

    Button tryMe = (Button)v.findViewById(R.id.tryMe);
    tryMe.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent cameraIntent = new Intent(mContext, OpencvCamera.class);
            mContext.startActivity(cameraIntent);
        }
    });

    return v;
}
<下面的代码是我希望我的按钮把图像从数据库传递到C++的,在那里它将与相机一起使用。在这里,按钮仅在按下时重定向到camera类

    Button tryMe = (Button)v.findViewById(R.id.tryMe);
    tryMe.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            /*WHAT SHOULD I PUT HERE FOR THE IMAGE PASSING*/

            Intent cameraIntent = new Intent(mContext, OpencvCamera.class);
            mContext.startActivity(cameraIntent);
        }
    }
下面是我的C代码++

JNIEXPORT void JNICALL Java_nerds_thesis_clartips_OpencvClass_humanDetection
  (JNIEnv *, jclass, jlong addrRgba){
    Mat& frame = *(Mat*)addrRgba;

    detectHuman(frame);
    }  

   void detectHuman(Mat& frame){
      String human_cascade_name = "/storage/emulated/0/haarcascade_upperbody.xml";
      CascadeClassifier human_cascade;
      if(!human_cascade.load( human_cascade_name ) ) { printf("--(!)Error loading\n"); return; };
      std::vector<Rect> humans;
      Mat frame_gray;
      cvtColor( frame, frame_gray, CV_BGR2GRAY );
      equalizeHist( frame_gray, frame_gray);

      //Detect Human
      human_cascade.detectMultiScale( frame_gray, humans, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(100, 100) );
      Mat imageMask = imread("/storage/emulated/0/plain.png");

      /*CODE FOR OVERLAYING THE IMAGE TO THE CAMERA*/
JNIEXPORT void JNICALL Java\u nerds\u论文\u clartips\u OpencvClass\u humanDetection
(JNINEV*,jclass,jlong addrRgba){
材料和框架=*(材料*)添加RRGBA;
探员(框架);
}  
真空检测器(垫和框架){
字符串human_cascade_name=“/storage/emulated/0/haarcascade_upperbody.xml”;
级联;
如果(!human_cascade.load(human_cascade_name)){printf(“-(!)错误加载\n”);返回;};
性病:人类病媒;
垫子框架为灰色;
CVT颜色(框架、框架灰、CV灰);
均衡器历史(帧灰,帧灰);
//探测人类
人类级联。检测多尺度(帧灰度,人类,1.1,2,0;CV|u HAAR|u尺度图像,大小(100100));
Mat imageMask=imread(“/storage/simulated/0/plain.png”);
/*用于将图像叠加到相机的代码*/

上面的行
Mat imageMask=imread(“/storage/simulated/0/plain.png”);
是我只为测试而做的。我只声明了它,并且我的任何按钮都使用了相同的图像。当然会。这就是为什么我要问,当我按下用java代码创建的按钮时,我该怎么做才能让我的本机代码访问图像。

我认为不可能在内存中传递图像对象;但是你可以传递一个对图像的引用,比如URL或文件路径,以供C++代码使用。
只需修改您的JNI声明以添加该引用。

您想对JNI中的图像做什么?该图像是一件衬衫,我希望它在检测到人体后覆盖在相机预览上,我基本上是初学者,因此这对我来说确实是一个难题。您能为您的答案提供一个代码示例吗?