精华内容
下载资源
问答
  • PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello-jni LOCAL_SRC_FILES := Native.c include $(BUILD_SHARED_LIBRARY) 注意:在Native.c中的 GetByteArrayElements其实是获取java中的数组指针,...

    MainActivity

    package com.example.arraydeliver;

    import android.app.Activity;

    import android.app.ActionBar;

    import android.app.Fragment;

    import android.os.Bundle;

    import android.util.Log;

    import android.view.LayoutInflater;

    import android.view.Menu;

    import android.view.MenuItem;

    import android.view.View;

    import android.view.ViewGroup;

    import android.widget.TextView;

    import android.os.Build;

    public class MainActivity extends Activity {

    byte[] a=new byte[]{0x32,0x33,0x34,'\0'};

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    TextView tv= new TextView(this);

    tv.setText(stringFromJNI(a));

    setContentView(tv);

    }

    public native static String stringFromJNI(byte[] a);

    static {

    System.loadLibrary("hello-jni");

    }

    }Native.c

    #include

    #include

    #include

    typedef unsigned char byte;

    JNIEXPORT jstring JNICALL Java_com_example_arraydeliver_MainActivity_stringFromJNI( JNIEnv* env,jobject thiz ,jbyteArray j){

    jbyte *temp=(*env)->GetByteArrayElements(env,j,0);

    char *x=(char *)temp;

    return (*env)->NewStringUTF(env,x+sizeof(x));

    }

    Android.mk

    LOCAL_PATH := $(call my-dir)

    include $(CLEAR_VARS)

    LOCAL_MODULE := hello-jni

    LOCAL_SRC_FILES := Native.c

    include $(BUILD_SHARED_LIBRARY)

    注意:在Native.c中的

    GetByteArrayElements其实是获取java中的数组指针,所以在使用完后记得要释放(*env)->ReleaseByteArrayElements(env,j,temp,0)

    注意2:C和C++中有些参数略有不同:C++中直接传入env->引用,C中则需要(×env)->,在C中

    jbyte *temp=(*env)->GetByteArrayElements(env,j,0);

    而在C++中则

    jbyte *temp=env->GetByteArrayElements(j,0);

    展开全文
  • NDK/JNI 中Java和C/C++互相传递数组版权声明:本文为CSDN博主「lza qq_895860866」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。原文链接:...

    NDK/JNI 中Java和C/C++互相传递数组

    版权声明:本文为CSDN博主「lza qq_895860866」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

    原文链接:https://blog.csdn.net/ezconn/article/details/101321564

    Java 和 C/C++通过Jni这个中间件,可以实现相互之间的数组传递;我这里提供几种方式;供参考;

    第一种:Java通过JNI传递给C/C++,经过处理后,再复制到Java数组并返回;

    Java的本地方法定义:

    public native int[] arrEncode(int[] arr);

    C代码的实现:

    #include

    JNIEXPORT jintArray JNICALL Java_com_example_arrtoc_MainActivity_arrEncode

    (JNIEnv *env, jobject obj, jintArray javaArr){

    //获取Java数组长度

    int lenght = (*env)->GetArrayLength(env,javaArr);

    //根据Java数组创建C数组,也就是把Java数组转换成C数组

    // jint* (*GetIntArrayElements)(JNIEnv*, jintArray, jboolean*);

    int* arrp =(*env)->GetIntArrayElements(env,javaArr,0);

    //把数组元素值加10处理

    int i;

    for(i =0 ; i

    *(arrp+i) +=10;

    }

    //将C数组种的元素拷贝到Java数组中

    (*env)->SetIntArrayRegion(env,javaArr,0,lenght,arrp);

    return javaArr;

    }

    第二种方式:在C中直接操作元素,然后把C数组复制到Java数组中,并更新Java数组;

    Java声明的本地方法

    public native void arrEncode(int[] arr);

    C代码实现

    #include

    JNIEXPORT void JNICALL Java_com_example_arrtoc_MainActivity_arrEncode

    (JNIEnv *env, jobject obj, jintArray javaArr){

    //获取Java数组长度

    int lenght = (*env)->GetArrayLength(env,javaArr);

    //根据Java数组创建C数组,也就是把Java数组转换成C数组

    // jint* (*GetIntArrayElements)(JNIEnv*, jintArray, jboolean*);

    int* arrp =(*env)->GetIntArrayElements(env,javaArr,0);

    //把数组元素值加10处理

    int i;

    for(i =0 ; i

    *(arrp+i) +=10;

    }

    //将C数组种的元素拷贝到Java数组中

    (*env)->SetIntArrayRegion(env,javaArr,0,lenght,arrp);

    }

    第三种:在C代码中新建Java数组,然后把C中数组的元素复制到Java数组中在返回给Java;

    Java定义的本地方法:

    public native int[] arrEncode(int[] arr);

    C代码实现:

    #include

    JNIEXPORT jintArray JNICALL Java_com_example_arrtoc_MainActivity_arrEncode

    (JNIEnv *env, jobject obj, jintArray javaArr){

    //获取Java数组长度

    int lenght = (*env)->GetArrayLength(env,javaArr);

    //根据Java数组创建C数组,也就是把Java数组转换成C数组

    // jint* (*GetIntArrayElements)(JNIEnv*, jintArray, jboolean*);

    int* arrp =(*env)->GetIntArrayElements(env,javaArr,0);

    //新建一个Java数组

    jintArray newArr = (*env)->NewIntArray(env,lenght);

    //把数组元素值加10处理

    int i;

    for(i =0 ; i

    *(arrp+i) +=10;

    }

    //将C数组种的元素拷贝到Java数组中

    (*env)->SetIntArrayRegion(env,newArr,0,lenght,arrp);

    return newArr;

    }

    第四种:通过JNI种的ReleaseArrayElements方法实现:

    这个方法的最后一个参数是模式:

    0:Java数组进行更新,并且释放C/C++数组。

    JNI_ABORT: Java数组不进行更新,但是释放C/C++数组。

    JNI_COMMIT: Java数组进行更新,不释放C/C++数组(函数执行完,数组还是会释放)。

    ————————————————

    版权声明:本文为CSDN博主「lza qq_895860866」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

    原文链接:https://blog.csdn.net/ezconn/article/details/101321564

    展开全文
  • jni中c++给java传递数组

    千次阅读 2017-07-28 14:28:43
    c++的数组java数组是不同的数据类型,所以无法直接传递 c++的数组java数组写法类似,所以就以为可以直接用,结果就一片红字 在传递之前要不c++的数组转换成java数组 int32_t a[3] = {0,1,2}; jintArray...

    c++的数组和java的数组是不同的数据类型,所以无法直接传递

    c++的数组和java的数组写法类似,所以就以为可以直接用,结果就一片红字

    在传递之前要不c++的数组转换成java数组

    int32_t a[3] = {0,1,2};
    jintArray array = env->NewIntArray(3);
    env->SetIntArrayRegion(array, 0, 3, a);

    这样就可以传给java了

    jclass jcl = env->GetObjectClass(ob);
    jmethodID mid = env->GetMethodID(jcl, "cToJava", "([III)V");
    env->CallVoidMethod(ob, mid,array,1,2);

    java函数

    public void cToJava(int[] pixs,int width,int height) {
        
    }

    至于数据类型网上都有,重点是boolean型是Z,long型是J





    展开全文
  • 目标:Java中声明排序接口,将数组Java传送到c,c排序后返回。通过替换dll切换排序方法。主要步骤:新建Java类,声明Native接口;自动生成JNI规范的对应C文件格式并实现;Java中加载C编译的dll,调用C的实现;1 ...

    想学学用C写写代码,发现Java可以通过JNI调用C,可以结合实现些花里胡哨的。遂下了DevC++,尝试一番,记下实践和注意点。

    目标:

    Java中声明排序接口,将数组从Java传送到c,c排序后返回。通过替换dll切换排序方法。

    主要步骤:

    新建Java类,声明Native接口;

    自动生成JNI规范的对应C文件格式并实现;

    Java中加载C编译的dll,调用C的实现;

    1 Java类声明native接口

    package me.cai7n.jni;

    public class SortThem {

    {

    System.load("D:\\Workspace\\devc\\JNITEST.dll");

    }

    public native int[] sort(int[] arr);

    public static void main(String[] args) {

    int[] arr = new int[]{3,7,1,2,5,9};

    int [] newArr = new SortThem().sort(arr);

    System.out.println("Java: ");

    for(int i : newArr)

    {

    System.out.print(" "+i);

    }

    System.out.println();

    }

    }

    2 在CMD编译class,并生成.h声明文件

    > javac SortThem.java

    // 返回到src根目录

    > javah -classpath . me.cai7n.jni.SortThem

    3 新建devc++项目,选择dll类型,项目下添加.h文件.c文件jni.h文件和jni_md.h文件,修改.h中的引用到"jni.h",因为放到同一个目录下了。编译时遇到其他找不到.h引用的错误类似处理。

    .c文件的具体实现:(include添加.h声明引用;参数定义变量名;添加实现;其中JNIEnv中保存了JNI传递类型值的处理方法;)

    #include "jni.h"

    #include "me_cai7n_jni_SortThem.h"

    #include

    JNIEXPORT jintArray JNICALL Java_me_cai7n_jni_SortThem_sort

    (JNIEnv *a, jobject b, jintArray c)

    {

    jsize len = (*a)->GetArrayLength(a, c);

    jint * data = (*a)->GetIntArrayElements(a, c, 0);

    {

    int i;

    printf("c origin:");

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

    printf("%d ", data[i]);

    }

    printf("\n");

    }

    {

    int n=6;

    int i,j,temp;

    //两个for循环,每次取出一个元素跟数组的其他元素比较

    //将最大的元素排到最后。

    for(j=0;j

    //外循环一次,就排好一个数,并放在后面,

    //所以比较前面n-j-1个元素即可

    for(i=0;i

    if(data[i]>data[i+1]) {

    temp = data[i];

    data[i] = data[i+1];

    data[i+1] = temp;

    }

    }

    }

    }

    {

    int i=0;

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

    printf("%d ", data[i]);

    }

    printf("\n");

    }

    //根据int数组个数来创建一个jintArray

    jintArray newIntArray = (*a)->NewIntArray(a, 6);

    //把jint指针中的元素设置到jintArray对象中

    (*a)->SetIntArrayRegion(a, newIntArray, 0, 6, data);

    //返回jintArray对象

    return newIntArray;

    }

    4 编译dll

    5 运行java main

    结果:

    Java:

    1 2 3 5 7 9

    c origin:3 7 1 2 5 9

    1 2 3 5 7 9

    疑惑:

    结果中c打印的在java返回打印之后打印

    展开全文
  • 新建一个oracle 数组类型的typecreate or replace type str_list as varray(1000) of varchar2(40)新建一个简单的存储过程测试用:create or replace procedure getReservoirReportForms(stcds in str_list,kk out ...
  • 我在java中创建了一个整数数组,并通过jni将数组传递给cpp程序我的代码是:import java.util.*;class SendArray {//Native method declarationnative int[] loadFile(int[] name);//Load the librarystatic {System....
  • 一、定义Java方法 public int testIntParameter(int[] value) { Log.e(TAG, "C++调用Java value =" + Arrays.toString(value)); return 1; } public int testFloatParameter(float[] value) { Log.e(TAG, ...
  • JNI中C和java传递数组

    千次阅读 2015-04-24 16:23:55
    GetByteArrayElements其实是获取java中的数组指针,所以在使用完后记得要释放(*env)->ReleaseByteArrayElements(env,j,temp,0) 注意2:C和C++中有些参数略有不同:C++中直接传入env->引用,C中则需要(×env)->,...
  • 新建一个oracle 数组类型的type  create or replace type str_list as varray(1000) of varchar2(40)  新建一个简单的存储过程测试用:   create or replace procedure getReservoirReportForms( stcds in ...
  • URL 通过Get方式传递数组参数方法1:?id=1&id=2&id=3后台获取时,只需要reqeust.getParameterValues("id") 获取String数组。http协议的要求解析参数时,相同的key会覆盖前一个,如果带[]会当成一维数组来处理,...
  • RESTful 一种软件架构风格,设计...需要传递数组参数的情况,如果是一般的form表单,可以直接定义参数类型为List即可(不能定义为数组类型,否则只能得到一个null)。示例代码如下:@POST@Path("/user" )public Res...
  • java传递 数组传递

    2019-10-08 18:13:03
    java中,不允许程序员选择值传递还是地址传递各个参数,基本类型总是按值传递。对于对象来说,是将对象的引用也就是副本传递给了方法,在方法中只有对对象进行修改才能影响该对象的值,操作对象的引用时是无法影响...
  • 数组在函数定义中的使用格式(int[] OrphanCount)调用的时候一般使用: int[] OrphanCountBefore = new int[2];theCalledMethod(OrphanCountBefore);这是公共函数public void GetOrphanCount(int[] OrphanCount) {int...
  • 根据教程及楼上我又修改了一下代码,看看三种方法中形参 arr 所占内存大小。#include using namespace std;double getAverage(int *... // 重载函数,形式参数是一个已定义大小的数组:double getAverage2(int arr[...
  • 伙计们,我认为几乎所有的语言,包括Java PASS数组都可以作为参考(可修改的)但不知何故,它在这里不起作用。测试数组仍然是1,2,3,大小为3奇怪的是,当我把结果[i]=2改为[1]=2时,它就起作用了。它确实通过了引用这...
  • java传递数组参数

    2007-03-05 10:45:46
    可能有很多人对java传递数组比较模糊,毕竟java中的数组和c的数组有一些不同。阅读它,也许对你有帮助。
  • 2、使用json方式传递参数解析C#后台得到的是个stringstring objStr = HttpContext.Current.Request["objStr"];objStr内容([{"0": "a", "1": "b", "2": "c", "3": "d"}, {"0": "aa", "1": "bb", "2": "cc", "3": "dd...
  • 当你将数组传递给其他方法时,实际上是复制对该数组的引用。通过该引用对数组内容进行的任何更改都会影响原始数组。但是,将引用更改为指向新数组不会更改原始方法中的现有引用。看到这篇文章。Java是“按引用传递”...
  • 我在我的prepare语句中遇到错误java.sql.SQLFeatureNotSupportedException.我正在使用Mysql数据库.以下是我的代码.class tmp {public static void main(String arg[]) {try {Class.forName("com.mysql.jdbc.Driver")...
  • JAVA数组作为函数参数传递

    千次阅读 2020-04-05 12:43:23
    本质上是传递数组的地址值。 既然传递的是数组的地址,那么方法就可以通过数组的地址改变内存中数组的内容。 类似于C语言中调用函数传递数组的指针一样。可以在函数中通过指针改变数组的内容。 所以在JAVA当中,数组...
  • 是否存在通过查询字符串传递数组的标准方法?需要明确的是,我有一个带有多个值的查询字符串,其中一个是数组值。 我希望将该查询字符串值视为一个数组-我不希望该数组爆炸,以使其与其他查询字符串变量没有区别。...
  • 小编典典对于Mysql-在Mysql中无法设置数组。取而代之的是,您可以在循环中以相同的方式来查询(?,?,..)值。String[] Parameter = { "user1", "Administrator" };String query = "select * from userinfo where ...
  • 看了很多篇博客,整理自网络。int[] a = new int[10];int[] b;b = a;复制代码让数组b直接指向数组a(即b = a;),这样做的目的是为了提高...所以,在Java语言中,b =a(a和b都是引用名)的含义就是将a起个别名"b"。a和b...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,578
精华内容 1,831
关键字:

java传递数组

java 订阅