Jni 使用

2 篇文章 0 订阅

Java操作:

       定义函数(关键字native): public native void FunctionName(byte arglist1[], char arglist2[], .....);

       Load库文件 : 

1.  System.loadLibrary("Name") 加载在library.path下Name.dll文件,注意linux下.so文件的命名格式是 libName.so,仍然加载("Name")而不是("libName")

2.  System.load("PATH/LibName.dll")  加载在绝对路径下Name.dll

        javac ClassName.java                     生成class文件

        例:javac JniCase.java

        javah Package.ClassName           生成Package_Class.h文件

        例:javah jni.test.JniCase

        java   Package.ClassName           执行程序  -Djava.library.path=指定lib目录

        例:java jni.test.JniCase

 例子JniCase.java:

package jni.test;
public class JniCase {
	public native int CFunction(byte datB[], char datC[], int len);
	
	public static void main(String[] args) {
		System.loadLibrary("TestLib");

        JniCase sample = new JniCase();
		final int DATA_SIZE = 128;
				
		byte datB[] = new byte[DATA_SIZE];
        char datC[] = new char[DATA_SIZE];
		  
	    sample.CFunction(datB, datC, DATA_SIZE);

        // Verification
        int i;
        for (i = 0 ; i < DATA_SIZE ; ++i) {
            if (datB[i] % 16 != datC[i]) {
                break;
            }
        }
	    if (i == DATA_SIZE) {
            System.out.printf("Success!\n");
        } else {
            System.out.printf("Fail!\n");
        }
    }
}

C操作:

       先将JDK下的include和include\win32导入lib工程下,引入javah生成的.h文件,在.h中有函数的定义。

       例: g++ TestLib.cpp -O2 -shared -fPIC -m64 -o libTestLib.so

       注意:1. 函数的命名格式:   Java_Package_Path_FunctionName();

                  2. Java中char size 是2 Byte,Byte才是真正C中的char。

                       typedef unsigned short  jchar;

例子TestLib.cpp:

#include "jni_test_JniCase.h"

JNIEXPORT jint JNICALL Java_jni_test_JniCase_CFunction
  (JNIEnv *env, jobject obj, jbyteArray bArr, jcharArray cArr, jint _size) {

      jbyte *cbArr = env->GetByteArrayElements(bArr, 0);
      jchar *ccArr = env->GetCharArrayElements(cArr, 0);

      for (int i = 0 ; i < _size ; ++i) {
          ccArr[i] = i % 16;
          cbArr[i] = i;
      }
      
      env->ReleaseByteArrayElements(bArr, cbArr, 0);
      env->ReleaseCharArrayElements(cArr, ccArr, 0);
      return 1;
}


        


JNI(Java Native Interface)是Java提供的一种机制,用于实现Java与其他编程语言(如C、C++)之间的交互。memset是C语言中的一个函数,用于将一块内存区域的值设置为指定的值。 在JNI使用memset函数可以用于初始化Java数组的元素值或者清空数组的元素值。具体使用步骤如下: 1. 首先,在Java代码中声明native方法,并使用关键字native修饰,表示该方法是由本地代码实现的。 ```java public class MyJNI { public native void initializeArray(int[] array, int value); } ``` 2. 然后,使用javah命令生成对应的C/C++头文件。 ```shell javah -jni MyJNI ``` 生成的头文件为`MyJNI.h`,其中包含了对应的native方法声明。 3. 在C/C++代码中实现native方法,并使用memset函数初始化或清空数组。 ```c #include "MyJNI.h" #include <string.h> JNIEXPORT void JNICALL Java_MyJNI_initializeArray(JNIEnv *env, jobject obj, jintArray array, jint value) { jint *arr = (*env)->GetIntArrayElements(env, array, NULL); jsize len = (*env)->GetArrayLength(env, array); memset(arr, value, len * sizeof(jint)); (*env)->ReleaseIntArrayElements(env, array, arr, 0); } ``` 在上述代码中,`GetIntArrayElements`函数用于获取Java数组的指针,`GetArrayLength`函数用于获取数组的长度,`ReleaseIntArrayElements`函数用于释放数组的指针。 4. 最后,将C/C++代码编译成动态链接库(或者静态链接库),并将生成的库文件加载到Java程序中。 至于使用memset函数的具体参数和用法,请参考C语言的相关文档或教程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值