Android jni 二维数组 传递
学习Android Jni时,一个二维 整数 数组的传递花了我好长时间,在网上查的资料都不全,当然最后是成功了,写在这里是为了自己记住,当然有人搜索到并利用了我会很高兴。
in Android Java file
public native boolean add(int[][] qizidata,.....)
用JDK工具生产jni 的*.h文件
your project path> ..Javajdk1.6.0_10binjavah -classpath ./bin JAVA Class name
//**************************************************************************
//二维数组java -》Jni
JNIEXPORT jint JNICALL Java_com_Jung_add
(JNIEnv * env, jobject
obj, jobjectArray qizidata,jint value1, jint
value2)
{
jint
i,j;
jint
qizi[1024][1024]; //固定数组,测试用
jarray
myarray;
int
size = (*env)->GetArrayLength(env, qizidata);
for (i
= 0; i < size &&
i<1024 ; i++)
{
myarray =
((*env)->GetObjectArrayElement(env, qizidata,
i));
int col =
(*env)->GetArrayLength(env,
myarray);
jint *coldata =
(*env)->GetIntArrayElements(env, (jintArray)myarray,
0 );
for (j=0; j<col
&& j <1024;
j++)
{
qizi[i][j]
= coldata[j];
}
(*env)->ReleaseIntArrayElements(env,
(jintArray)myarray, coldata,0 );
}
return
(qizi[0][0]+qizi[9][0]);
}
//**************************************************************************
//二维数组Jni -》Java
JNIEXPORT jobjectArray JNICALL
Java_com_marakana_NativeLib_GetIntArray
(JNIEnv *env, jobject obj, jint x, jint y)
{
(JNIEnv *env, jobject obj, jint x, jint y)
{
jobjectArray ret;
int i =
0;
int j =
0;
jclass
intArrCls = (*env)->FindClass(env, "[I");
if (
NULL== intArrCls)
return NULL;
ret =
(*env)->NewObjectArray(env, x * y, intArrCls,
NULL);
jint
tmp[1024];//固定数组,测试用,注意别溢出
for (i
= 0; i < x; i++) {
jintArray intArr =
(*env)->NewIntArray(env,y);
for (j = 0; j <
y; j++) {
tmp[j] = i + j;
}
(*env)->SetIntArrayRegion(env,intArr, 0, y,
tmp);
(*env)->SetObjectArrayElement(env,ret, i,
intArr);
(*env)->DeleteLocalRef(env,intArr);
}
return
ret;
}
//**************************************************************************
//下面代码是网上搜的,没验证,忘记出处了,请原作者见谅
// 二维String数组 JNI 提取
c_languge syntax
JNIEXPORT void JNICALL Java_TestArray_PrintArrays
(JNIEnv *env, jclass class, jobjectArray array)
{
int
size = (*env)->GetArrayLength(env, array);
for
(int i = 0; i < size; i++)
{
jarray myarray =
((*env)->GetObjectArrayElement(env, array,
i));
int leng =
(*env)->GetArrayLength(env, myarray);
printf("length: %dn",
leng);
for (int j = 0; j
< leng; j++)
{
jstring string =
((*env)->GetObjectArrayElement(env, myarray,
i));
const char * chars =
(*env)->GetStringUTFChars(env, string, 0);
printf("%s n", chars);
(*env)->ReleaseStringUTFChars(env,
string, chars);
}
}
}
分类:
android提高篇
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!