直接看代码
public class IntArray{
public native int sumArray(int arr[]); //声明本地方法
public static void main(String[] args) {
IntArray p = new IntArray();
int arr[] = new int[10];
for (int i = 0; i < 10; i++) {
arr[i] = i;
}
int sum = p.sumArray(arr);
System.out.println("sum = "+sum);
}
static{
//System.loadLibrary("helloworld"); // 加载库文件
System.load("/Users/zhaoshun/solibs/libIntArr.so");
}
}
/**
* JNI 对每种数据类型的数组都有对应的函数。
* 如下直接操作数组是错误的:
JNIEXPORT jint JNICALL
Java_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray arr) {
int i,sum=0;
for(i=0;i<10;i++){
sum += arr[i];
}
}
JNI 中数组的基类为 jarray,其他如 jintArray 都继承自 jarray。
头文件内容
* Class: jni_sample_IntArray
* Method: sumArray
* Signature: ([I)I
JNIEXPORT jint JNICALL Java_jni_sample_IntArray_sumArray(JNIEnv *, jobject, jintArray);
运行结果:
sum = 45
*/
#include <jni.h>
#include <stdio.h>
#include "jni_sample_IntArray.h"
// printf 在stdio.h头文件中
JNIEXPORT jint JNICALL Java_jni_sample_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray arr)
{
jint buf[10];
jint i,sum = 0;
(*env)->GetIntArrayRegion(env,arr,0,10,buf); //把 arr 赋值给了 buf?
for (i = 0;i<10;i++) {
sum += buf[i];
}
return sum;
}
/**
使用 GetIntArrayRegion 拷贝数组内容到 buf 中,这里没有做越界异常检测, 因为知道数组有 10 个,参数 3 为待拷贝数组的起始位置,参数 4 为拷贝元素的个数。
JNI 支持 SetIntArrayRegion 允许重新设置数组一个区域的值,其他基本类型(boolean, short, 和float)也有对应的支持。
JNI 支持通过 Get/Release<Type>ArrayElemetns 返回 Java 数组的一个拷贝(实现优良的 VM,会返回指向 Java 数组的一个直接的指针,并标记该内存区域,不允许被 GC)。
JNIEXPORT jint JNICALL Java_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray arr)
{
jint *carr;
jinti,sum=0;
carr = (*env)->GetIntArrayElements(env, arr, NULL);
if (carr == NULL) {
return 0;
}
for (i=0; i<10; i++) {
sum += carr[i];
}
(*env)->ReleaseIntArrayElements(env, arr, carr, 0);
return sum;
}
GetArrayLength 返回数组元素个数。
*/
分享到:
相关推荐
JAVA语言及其标准API(应用程序编程接口)应付应用程序的编写已绰绰有余。但在某些情况下,还是必须使用非JAVA编码。例如,我们有时要访问操作系统的专用特性,与特殊的硬件设备打交道,重复使用现有的非Java接口,...
jni详解 JNI设计实践之路 JNI技术手册 Java_JNI_编程进阶 android_jni操作指南
此时,VM扮演着桥梁的角色,让Java与C组件能通过标准的JNI介面而相互沟通。 应用层的Java类是在虚拟机(VM: Vitual Machine)上执行的,而C件不是在VM上执行,那么Java程式又如何要求VM去载入(Load)所指定的C组件呢?...
5本JNI资料,非常详细; 1.android_jni操作指南.pdf 2.JNI设计实践之路.pdf 3.jni详解.pdf 4.Java_JNI_编程进阶.pdf 5.Android_JNI总结.doc
详细的讲解java jni的内幕和使用,希望对你有所帮助
本文档主要讲述的是Java本地调用JNI使用规范详解;JNI概述;JavaNative Interface的缩写,中文为Java本地调用。从Java1.1开始,JNI即成为Java标准的一部分。 JNI设计的目的是为了允许Java代码与其他语言进行交互。但...
Android调用C++接口调用技术Java Native Interface(JNI)详解,
介绍了Android下jni的使用,使用学习使用。
Java和JNI读取android apk里assets文件夹示例demo,参见博客详解: http://blog.csdn.net/yanzi1225627/article/details/20577059
博文链接:https://huangpengxiao.iteye.com/blog/96670
JNI详解学习
JNI,全称为Java Native Interface,即Java本地接口,JNI是Java调用Native 语言的一种特性。通过JNI可以使得Java与C/C++机型交互。即可以在Java代码中调用C/C++等语言的代码或者在C/C++代码中调用Java代码。由于JNI...
JNI是现在app开发必须要了解的,本人将jni实现java与c互相调用的原理以及实现做了详细的讲解,希望对大家有所帮助
Java本地接口(JNI)编程指南和规范2 jni详解 两个电子书籍!
JNI技术详解,帮你快速掌握Java调用C/C++的JNI技术。
《jpa详解视频教程》165M 《spring2.5视频教程》365M 《传智播客_AJAX视频教程》1.27G 《传智播客_FTP视频教程》117M 《传智播客_hibernate视频教程》573M 《传智播客_俄罗斯方块游戏开发_视频教程》217M 《传智播客...
一般来说,JNI有点复杂。但是,如果你仅仅单向调用--从Java调用本地代码,并且仅使用基本型进行通讯--事情还是很简单的。本文介绍了在Java中声明JNI方法,给出了在Java应用程序中使用JNI来监视CPU的实例。
《传智播客_王泽佑_JNI教程》173M 《传智播客_张孝祥_javascript教程》1.12G 《传智播客_张孝祥_java高级视频》797M 《传智播客_张孝祥_java基础教程》1.6G 《传智播客fckeditor视频教程》173M 《传智播客java...
代码 NDK1-1HelloWorld NDK1-2NDKStringTYPE NDK1_3NDKDTRegist NDK1_4NDKAccessFile NDK1_5CallJavaMethod NDK1_6javaThreadCallC NDK1_7CThreadCallJava 文档 JNI JNI详解
适合对JNI尚不了解的开发者。介绍如何在Android环境下使用JNI已达到java与C/C++函数互调,描述如何在VM中调用C/C++函数。