-
jni c向java传递数组_JNI中C和java传递数组
2021-02-26 08:26:18PATH := $(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);
-
jni c向java传递数组_NDK/JNI 中Java和C/C++互相传递数组
2021-02-26 08:25:39NDK/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:43c++的数组和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
-
jni c向java传递数组_记JNI实践(Java调用C数组排序)
2021-03-03 14:57:49目标: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传数组到java_java传递数组类型参数给oracle存储过程
2021-03-17 14:37:32新建一个oracle 数组类型的typecreate or replace type str_list as varray(1000) of varchar2(40)新建一个简单的存储过程测试用:create or replace procedure getReservoirReportForms(stcds in str_list,kk out ... -
jni c向java传递数组_通过jni将jint数组从c返回到java
2021-03-03 14:57:59我在java中创建了一个整数数组,并通过jni将数组传递给cpp程序我的代码是:import java.util.*;class SendArray {//Native method declarationnative int[] loadFile(int[] name);//Load the librarystatic {System.... -
JNI C++调用Java 传递数组参数(四)
2021-01-11 11:06:44一、定义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:55GetByteArrayElements其实是获取java中的数组指针,所以在使用完后记得要释放(*env)->ReleaseByteArrayElements(env,j,temp,0) 注意2:C和C++中有些参数略有不同:C++中直接传入env->引用,C中则需要(×env)->,... -
java传递数组类型参数给oracle存储过程
2013-07-27 10:56:35新建一个oracle 数组类型的type create or replace type str_list as varray(1000) of varchar2(40) 新建一个简单的存储过程测试用: create or replace procedure getReservoirReportForms( stcds in ... -
java get数组参数传递_URL 通过Get方式传递数组参数
2021-02-12 18:49:26URL 通过Get方式传递数组参数方法1:?id=1&id=2&id=3后台获取时,只需要reqeust.getParameterValues("id") 获取String数组。http协议的要求解析参数时,相同的key会覆盖前一个,如果带[]会当成一维数组来处理,... -
java get数组参数_Restful传递数组参数及注解大全
2021-03-06 15:54:12RESTful 一种软件架构风格,设计...需要传递数组参数的情况,如果是一般的form表单,可以直接定义参数类型为List即可(不能定义为数组类型,否则只能得到一个null)。示例代码如下:@POST@Path("/user" )public Res... -
java 值传递 数组传递
2019-10-08 18:13:03在java中,不允许程序员选择值传递还是地址传递各个参数,基本类型总是按值传递。对于对象来说,是将对象的引用也就是副本传递给了方法,在方法中只有对对象进行修改才能影响该对象的值,操作对象的引用时是无法影响... -
java 传参数 数组_Java参数传递 数组的使用
2021-03-06 00:23:08数组在函数定义中的使用格式(int[] OrphanCount)调用的时候一般使用: int[] OrphanCountBefore = new int[2];theCalledMethod(OrphanCountBefore);这是公共函数public void GetOrphanCount(int[] OrphanCount) {int... -
java将数组传给函数_C++ 传递数组给函数 | 菜鸟教程
2021-03-09 08:07:46根据教程及楼上我又修改了一下代码,看看三种方法中形参 arr 所占内存大小。#include using namespace std;double getAverage(int *... // 重载函数,形式参数是一个已定义大小的数组:double getAverage2(int arr[... -
java用引用传递数组_java数组按引用传递不起作用?
2021-03-16 00:04:56伙计们,我认为几乎所有的语言,包括Java PASS数组都可以作为参考(可修改的)但不知何故,它在这里不起作用。测试数组仍然是1,2,3,大小为3奇怪的是,当我把结果[i]=2改为[1]=2时,它就起作用了。它确实通过了引用这... -
java中传递数组参数
2007-03-05 10:45:46可能有很多人对java的传递数组比较模糊,毕竟java中的数组和c的数组有一些不同。阅读它,也许对你有帮助。 -
java向页面传递数组_页面传递数组参数
2021-02-26 20:44:532、使用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类和对象数组传参_在Java中是按值传递数组还是按引用传递数组?
2020-12-21 12:33:13当你将数组传递给其他方法时,实际上是复制对该数组的引用。通过该引用对数组内容进行的任何更改都会影响原始数组。但是,将引用更改为指向新数组不会更改原始方法中的现有引用。看到这篇文章。Java是“按引用传递”... -
java get数组参数传递_在prepare语句中传递数组参数 – 获取“java.sql.SQLFeatureNotSupportedException”...
2021-03-08 09:06:00我在我的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当中,数组... -
java 传递字符串数组_如何在查询字符串中传递数组?
2021-03-09 06:02:38是否存在通过查询字符串传递数组的标准方法?需要明确的是,我有一个带有多个值的查询字符串,其中一个是数组值。 我希望将该查询字符串值视为一个数组-我不希望该数组爆炸,以使其与其他查询字符串变量没有区别。... -
java获取数组参数_在prepare语句中传递数组参数-获取“ java.sql.SQLFeatureNotSupportedException”...
2021-03-10 07:01:00小编典典对于Mysql-在Mysql中无法设置数组。取而代之的是,您可以在循环中以相同的方式来查询(?,?,..)值。String[] Parameter = { "user1", "Administrator" };String query = "select * from userinfo where ... -
java 引用数组_Java 数组的引用传递
2021-03-05 23:21:22看了很多篇博客,整理自网络。int[] a = new int[10];int[] b;b = a;复制代码让数组b直接指向数组a(即b = a;),这样做的目的是为了提高...所以,在Java语言中,b =a(a和b都是引用名)的含义就是将a起个别名"b"。a和b...