JAVA JNI传递数据结构/类的例子

java通过JNI向C/C++传递基本数据类型比较简单,但基本数据类型很难满足应用程序开发的需要,心想要是能传递一个数据结构/类就好了。于是通过下面例子实验了通过JNI传递数据结构/类也是OK的

1,定义一个用于测试的数据类(很简单,没有成员方法)

package com.rain.test;

public class testclass {
	public int iValue;
	public String strValue;
}

2,java主程序

package com.rain.test;

public class jniproject {

	public native String hello(testclass value);
	
	static
	{
		System.loadLibrary("jniproject");
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		testclass c = new testclass();
		c.iValue = 100;
		c.strValue = new String("HelloWorld");
		
		jniproject prj = new jniproject();
		String strResult = prj.hello(c);
		System.out.print(strResult);		
	}

}

3,工程中建立jni目录,并利用javah编译出c头文件

javah -classpath bin -d jni com.rain.test.jniproject


4,新建jniproject.c文件实现native方法

#include "com_rain_test_jniproject.h"
#include <jni.h>

typedef struct
{
  int iValue;
  char* pStrValue;
}TestClass;

jstring Java_com_rain_test_jniproject_hello(JNIEnv* pEnv, jobject obj, jobject arg)
{
  jclass jcarg = (*pEnv)->GetObjectClass(pEnv, arg);

  TestClass input;
  jfieldID iid = (*pEnv)->GetFieldID(pEnv, jcarg, "iValue", "I");
  input.iValue = (*pEnv)->GetIntField(pEnv, arg, iid);

  jfieldID strid = (*pEnv)->GetFieldID(pEnv, jcarg, "strValue", "Ljava/lang/String;");
  jstring strValue = (*pEnv)->GetObjectField(pEnv, arg, strid);

  jsize strLen = (*pEnv)->GetStringUTFLength(pEnv, strValue);
  const char* pStrValue = (*pEnv)->GetStringUTFChars(pEnv, strValue, NULL);

  input.pStrValue = malloc(strLen + 1);
  strcpy(input.pStrValue, pStrValue);
  (*pEnv)->ReleaseStringUTFChars(pEnv, strValue, pStrValue);

  char buff[256] = {0};
  snprintf(buff, 255, "%d + %s", input.iValue, input.pStrValue);
  free(input.pStrValue);

  return (*pEnv)->NewStringUTF(pEnv, buff);
}


5,编译动态库

$ gcc -c -fPIC -I$JAVA_HOME/include -I$JAVA_HOME/include/linux jniproject.c

$ gcc -shared -fPIC -o libjniproject.so jniproject.o


6,为了使java能够找到so文件,避免程序运行时出现“java.library.path”相关的错误,需在eclipse中设置

select project, right click->properties, "java build path", "libraries" tab, select a jar, expand it, select "Native library location", click "edit...", folder chooser dialog will appear

7,运行



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值