@w1992wishes
2018-05-12T11:13:07.000000Z
字数 2553
阅读 2514
JAVA_JNI
本篇结构:
因为对C/C++不算了解,所以JNI系列的博文更多是在实战操作方面,这里接上面的文章,补充下JNI访问List集合实例。
import java.util.ArrayList;
import java.util.List;
/**
* @Author: w1992wishes
* @Date: 2018/5/12 10:44
*/
public class JNIListTest {
static {
System.loadLibrary("JNIListTest");
}
private native void execute(List<float[]> points);
public static void main(String[] args) {
List<float[]> points = new ArrayList<>();
points.add(new float[]{0.1f, 0.2f, 0.3f});
points.add(new float[]{0.4f, 0.5f, 0.6f});
points.add(new float[]{0.7f, 0.8f, 0.9f});
JNIListTest test = new JNIListTest();
test.execute(points);
}
}
javac JNIListTest.java
javah -d jnilib -jni JNIListTest
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class JNIListTest */
#ifndef _Included_JNIListTest
#define _Included_JNIListTest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: JNIListTest
* Method: execute
* Signature: (Ljava/util/List;)V
*/
JNIEXPORT void JNICALL Java_JNIListTest_execute
(JNIEnv *, jobject, jobject);
#ifdef __cplusplus
}
#endif
#endif
#include "JNIListTest.h"
#include <stdio.h>
extern "C"
JNIEXPORT void JNICALL Java_JNIListTest_execute
(JNIEnv *env, jobject obj, jobject objectList)
{
const char *str ="enter native method\n";
printf("%s",str);
/* get the list class */
jclass cls_list = env->GetObjectClass(objectList);
if(cls_list == NULL){
printf("%s","not find class\n");
}
/* method in class List */
jmethodID list_get = env->GetMethodID(cls_list, "get", "(I)Ljava/lang/Object;");
jmethodID list_size = env->GetMethodID(cls_list, "size", "()I");
if(list_get == NULL){
printf("%s","not find get method\n");
}
if(list_size == NULL){
printf("%s","not find size method\n");
}
/* jni invoke list.get to get points count */
int len = static_cast<int>(env->CallIntMethod(objectList, list_size));
if(len > 0){
printf("len %d\n", len);
}
/* Traversing all counts */
int i;
for (i=0; i < len; i++) {
/* get list the element -- float[] */
jfloatArray element = (jfloatArray)(env->CallObjectMethod(objectList, list_get, i));
if(element == NULL){
printf("%s","fetch list element failure\n");
}
float *f_arrays;
f_arrays = env->GetFloatArrayElements(element,NULL);
if(f_arrays == NULL){
printf("%s","fetch float array failure\n");
}
int arr_len = static_cast<int>(env->GetArrayLength(element));
int j;
for(j=0; j<arr_len ; j++){
printf("\%f \n", f_arrays[j]);
}
/* 释放可能复制的缓冲区 */
env->ReleaseFloatArrayElements(element, f_arrays, 0);
/* 调用 JNI 函数 DeleteLocalRef() 删除 Local reference。Local reference 表空间有限,这样可以避免 Local reference 表的内存溢出,避免 native memory 的 out of memory。*/
env->DeleteLocalRef(element);
}
}
g++ -D_REENTRANT -fPIC -I $JAVA_HOME
/include -I $JAVA_HOME
/include/linux -shared -o libJNIListTest.so JNIListTest.cpp
最后运行java -Djava.library.path=jnilib JNIListTest。