JNI总和2维数组 [英] JNI sum 2 dimentional array

查看:217
本文介绍了JNI总和2维数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

想与NDK的工作,我不得不与Android工作室没有运气(到现在为止我没有得到指示,因为我做的一切在终端IDE之外,没有code完成NDK路径点),我切换到日食,这使得它更容易使用JNI和NDK开发工作。

首先,我创建了一个项目,总结整数在C二维数组和金额恢复到Java端。我无法得到它的工作。你能帮忙吗?!

用C我的code是:

 的#include< jni.h>
JNIEXPORT jint JNICALL Java_com_example_jninew_MainActivity_getNum(JNIEnv的* ENV,jobject OBJ,jintArray ARR)
{
  INT I,J,总和= 0;
  jsize宽度=(* ENV) - GT; GetArrayLength(ENV,ARR);
  jintArray *行=(* ENV) - GT; GetIntArrayElements(ENV,编曲,0);
   对于(i = 0; I<宽度;我++){       jint * POS =(* ENV) - GT; GetIntArrayElements(ENV,行了,我);
       为(J = 0; J<高度; J ++){
               总和+ = POS [I] [J]。
          }
   }
   (* ENV) - GT; ReleaseIntArrayElements(ENV,编曲,线,0);
     返回总和;
}

我的Java code是:

 包com.example.jninew;进口android.app.Activity;
进口android.os.Bundle;
进口android.view.Menu;
进口android.view.MenuItem;
进口android.widget.TextView;公共类MainActivity延伸活动{    @覆盖
    保护无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);
        TextView中的TextView =(的TextView)findViewById(R.id.tv);
        INT [] []α= {{1,2},{3,4}};
        textView.setText(之和为:+ getNum(一));
    }
    静态的{
        的System.loadLibrary(getNum);
    }
    天然INT getNum(中间体[] []一个);


}


解决方案

我想应该是这样的:

 的#include< jni.h>
JNIEXPORT jint JNICALL Java_com_example_jninew_MainActivity_getNum(JNIEnv的* ENV,jobject OBJ,jintArray ARR)
{
  INT I,J,总和= 0;
  jsize宽度=(* ENV) - GT; GetArrayLength(ENV,ARR);   对于(i = 0; I<宽度;我++){        jintArray *行=(* ENV) - GT; GetObjectArrayElement(ENV,编曲,我);
        INT高度=(* ENV) - GT; GetArrayLength(ENV,线);
        jint * POS =(* ENV) - GT; GetIntArrayElements(环境,线路,0);        为(J = 0; J<高度; J ++){
               总和+ = POS [J]。
          }
        (* ENV) - GT; ReleaseIntArrayElements(ENV,编曲,POS,0);
        (* ENV) - GT; ReleaseIntArrayElements(ENV,编曲,线,0);
   }
     返回总和;
}

wanting to work with NDK, I had no luck with android studio(till now I don't get the point of indicating the NDK path since I do everything in terminal outside of IDE and no code completion), I switched to eclipse which makes it more easier to work with jni and ndk dev.

To begin, I created a project to sum a 2d array of integer in c and return the sum to java side. I can't get it to work. can you help?!!

my code in C is:

 #include <jni.h>
JNIEXPORT jint JNICALL Java_com_example_jninew_MainActivity_getNum(JNIEnv *env, jobject obj, jintArray arr)
{
  int i,j, sum = 0;
  jsize width = (*env)->GetArrayLength(env, arr);
  jintArray *line = (*env)->GetIntArrayElements(env, arr, 0);
   for (i=0; i<width; i++){

       jint *pos = (*env)->GetIntArrayElements(env, line, i);
       for (j=0; j<height; j++){
               sum += pos[i][j];
          }
   }
   (*env)->ReleaseIntArrayElements(env, arr, line, 0);
     return sum;
}

My java Code is:

package com.example.jninew;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView textView = (TextView) findViewById(R.id.tv);
        int[][] a = {{1,2},{3,4}};
        textView.setText("sum is: "+getNum(a));


    }
    static{
        System.loadLibrary("getNum");
    }
    native int getNum(int[][] a);
.
.
.}

解决方案

i think it should be like this:

   #include <jni.h>
JNIEXPORT jint JNICALL Java_com_example_jninew_MainActivity_getNum(JNIEnv *env, jobject obj, jintArray arr)
{
  int i,j, sum = 0;
  jsize width = (*env)->GetArrayLength(env, arr);

   for (i=0; i<width; i++){

        jintArray *line =   (*env)->GetObjectArrayElement(env, arr, i);
        int height =       (*env)->GetArrayLength(env, line);
        jint *pos = (*env)->GetIntArrayElements(env, line, 0);

        for (j=0; j<height; j++){
               sum += pos[j];
          }
        (*env)->ReleaseIntArrayElements(env, arr, pos, 0);
        (*env)->ReleaseIntArrayElements(env, arr, line, 0);
   }


     return sum;
}

这篇关于JNI总和2维数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆