JAVA JNI入门

首先是主java程序,声明了几个native方法。

package com;

/**
 * 
 * 
 * 
 * javac -h /home/h/eclipse-workspace/jniTest/src HelloWorldJNI.java
 * 
 * @author h
 *
 */

public class HelloWorldJNI {

	private int groupId = 1024;

	private String topic = "news001";
	
	static {
		System.loadLibrary("native");
	}

	public static void myStaticMethod() {
		System.out.println("java static   myStaticMehod");
	}

	public static void main(String[] args) {
		HelloWorldJNI a = new HelloWorldJNI();
//		a.sayHello();
//		System.out.println(a.getNum());
//		a.setName("mmmmmmmmm");
//		System.out.println(a.getNewString());
//		a.callPrint();
//		a.callJavaPrint2();
//		a.callJavaPrint3();
//		a.callJavaVoidMethod();
//		a.callJavaStaticMethod();

//		boolean[] s = a.getBooleanArrayFromJNI();
//		for (boolean d : s) {
//			System.out.println(d);

//		int[] ss = a.getIntArrayFromJNI();
//		for (int d2 : ss) {
//			System.out.println(d2);
//		}
		
		int a2[] = { 0, 100, 200, 300, 400 };
		a.sendIntArrayToJNI(a2);
		
//		System.out.println(a.getIntField());
//		System.out.println(a.getStringField());
	}

	private void voidMethod() {
		System.out.println("java  voidMethod");
	}

	private void javaPrint() {
		System.out.println("java  print 0");
	}

	private void javaPrint(int width) {
		System.out.println("java  print 1 " + width);
	}

	private String javaPrint(int width, int height) {
		System.out.println("java  print 2:  " + width);
		String a = width + height + "";
//		System.out.println(a);
		return a;
	}

	private int javaPrint2(int width, int height) {
		System.out.println("java  print 2:  " + width);
		int a = width + height;
//		System.out.println(a);
		return a;
	}

	private String javaPrint3(int width, String name) {
		System.out.println("java  print 3 ,width :  " + width);
		System.out.println("java  prin t3, name :  " + name);
		return "javaPrint3 result";
	}

	private native void sayHello();

	private native int getNum();

	private native void setName(String a);

	private native String getNewString();

	private native void callPrint();

	private native void callJavaPrint2();

	private native void callJavaPrint3();

	private native void callJavaVoidMethod();

	private native void callJavaStaticMethod();

	private native boolean getBooleanFromJNI();

	private native boolean[] getBooleanArrayFromJNI();

	private native int[] getIntArrayFromJNI();

	private native void sendIntArrayToJNI(int[] array);
	
	private native int getIntField();
	
	private native String getStringField();

}

使用
javac -h . HelloWorldJNI.java
生成.h文件

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_HelloWorldJNI */

#ifndef _Included_com_HelloWorldJNI
#define _Included_com_HelloWorldJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_HelloWorldJNI
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_HelloWorldJNI_sayHello
  (JNIEnv *, jobject);

/*
 * Class:     com_HelloWorldJNI
 * Method:    getNum
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_com_HelloWorldJNI_getNum
  (JNIEnv *, jobject);

/*
 * Class:     com_HelloWorldJNI
 * Method:    setName
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_com_HelloWorldJNI_setName
  (JNIEnv *, jobject, jstring);

/*
 * Class:     com_HelloWorldJNI
 * Method:    getNewString
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_HelloWorldJNI_getNewString
  (JNIEnv *, jobject);

/*
 * Class:     com_HelloWorldJNI
 * Method:    callPrint
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_HelloWorldJNI_callPrint
  (JNIEnv *, jobject);

/*
 * Class:     com_HelloWorldJNI
 * Method:    callJavaPrint2
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_HelloWorldJNI_callJavaPrint2
  (JNIEnv *, jobject);

/*
 * Class:     com_HelloWorldJNI
 * Method:    callJavaPrint3
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_HelloWorldJNI_callJavaPrint3
  (JNIEnv *, jobject);

/*
 * Class:     com_HelloWorldJNI
 * Method:    callJavaVoidMethod
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_HelloWorldJNI_callJavaVoidMethod
  (JNIEnv *, jobject);

/*
 * Class:     com_HelloWorldJNI
 * Method:    callJavaStaticMethod
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_HelloWorldJNI_callJavaStaticMethod
  (JNIEnv *, jobject);

/*
 * Class:     com_HelloWorldJNI
 * Method:    getBooleanFromJNI
 * Signature: ()Z
 */
JNIEXPORT jboolean JNICALL Java_com_HelloWorldJNI_getBooleanFromJNI
  (JNIEnv *, jobject);

/*
 * Class:     com_HelloWorldJNI
 * Method:    getBooleanArrayFromJNI
 * Signature: ()[Z
 */
JNIEXPORT jbooleanArray JNICALL Java_com_HelloWorldJNI_getBooleanArrayFromJNI
  (JNIEnv *, jobject);

/*
 * Class:     com_HelloWorldJNI
 * Method:    getIntArrayFromJNI
 * Signature: ()[I
 */
JNIEXPORT jintArray JNICALL Java_com_HelloWorldJNI_getIntArrayFromJNI
  (JNIEnv *, jobject);

/*
 * Class:     com_HelloWorldJNI
 * Method:    sendIntArrayToJNI
 * Signature: ([I)V
 */
JNIEXPORT void JNICALL Java_com_HelloWorldJNI_sendIntArrayToJNI
  (JNIEnv *, jobject, jintArray);

/*
 * Class:     com_HelloWorldJNI
 * Method:    getIntField
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_com_HelloWorldJNI_getIntField
  (JNIEnv *, jobject);

/*
 * Class:     com_HelloWorldJNI
 * Method:    getStringField
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_HelloWorldJNI_getStringField
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

然后来实现:

#include <iostream>
#include  "com_HelloWorldJNI.h" 

using namespace std;

JNIEXPORT void JNICALL Java_com_HelloWorldJNI_sayHello(JNIEnv*, jobject) {
	cout << "12333" << endl;
}

/*
 * Class:     com_HelloWorldJNI
 * Method:    getNum
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_com_HelloWorldJNI_getNum(JNIEnv*, jobject) {
	jint a = 10;
	return a;
}

/*
 * Class:     com_HelloWorldJNI
 * Method:    setName
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_com_HelloWorldJNI_setName(JNIEnv *env, jobject obj,
		jstring a) {
	char buf[128];
	const char *str = env->GetStringUTFChars(a, 0);
	printf("from java: %s\n", str);
}

/*
 * Class:     com_HelloWorldJNI
 * Method:    getNewString
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_HelloWorldJNI_getNewString(JNIEnv *env,
		jobject obj) {
	const char *buf = "h from jni";
	return env->NewStringUTF(buf);
}

/*
 * Class:     com_HelloWorldJNI
 * Method:    callPrint
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_HelloWorldJNI_callPrint(JNIEnv *env,
		jobject obj) {
	// Find the id of the Java method to be called
	jclass helloClass = env->GetObjectClass(obj);

	jmethodID methodId = env->GetMethodID(helloClass, "javaPrint",
			"(II)Ljava/lang/String;");
	cout << "jni say:" << endl;
	jstring result = (jstring) env->CallObjectMethod(obj, methodId, 123, 10);
	cout << env->GetStringUTFChars(result, 0) << endl;
}

/*
 * Class:     com_HelloWorldJNI
 * Method:    callJavaPrint2
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_HelloWorldJNI_callJavaPrint2(JNIEnv *env,
		jobject obj) {
// Find the id of the Java method to be called
	jclass helloClass = env->GetObjectClass(obj);

	jmethodID methodId = env->GetMethodID(helloClass, "javaPrint2", "(II)I");
	cout << "jni say:" << endl;
	jint result = env->CallIntMethod(obj, methodId, 123, 10);
	cout << result << endl;
}

/*
 * Class:     com_HelloWorldJNI
 * Method:    callJavaPrint3
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_HelloWorldJNI_callJavaPrint3(JNIEnv *env,
		jobject obj) {
	jclass helloClass = env->GetObjectClass(obj);
	jmethodID methodId = env->GetMethodID(helloClass, "javaPrint3",
			"(ILjava/lang/String;)Ljava/lang/String;");
	cout << "JNI: Java_com_HelloWorldJNI_callJavaPrint3:" << endl;
	const char *buf = "I am  from jni,hi";
	jstring a2 = env->NewStringUTF(buf);
	jstring result = (jstring) env->CallObjectMethod(obj, methodId, 123, a2);
	cout << "JNI end" << endl;
}

/*
 * Class:     com_HelloWorldJNI
 * Method:    callJavaVoidMethod
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_HelloWorldJNI_callJavaVoidMethod(JNIEnv *env,
		jobject obj) {
	jclass helloClass = env->GetObjectClass(obj);
	jmethodID methodId = env->GetMethodID(helloClass, "voidMethod", "()V");
	cout << "JNI: Java_com_HelloWorldJNI_callJavaVoidMethod:" << endl;
	env->CallVoidMethod(obj, methodId);
	cout << "JNI end" << endl;
}

/*
 * Class:     com_HelloWorldJNI
 * Method:    callJavaStaticMethod
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_HelloWorldJNI_callJavaStaticMethod(JNIEnv *env,
		jobject obj) {
	jclass helloClass = env->GetObjectClass(obj);
	jmethodID methodId = env->GetStaticMethodID(helloClass, "myStaticMethod",
			"()V");
	cout << "JNI: Java_com_HelloWorldJNI_callJavaStaticMethod:" << endl;
	env->CallStaticVoidMethod(helloClass, methodId);
	cout << "JNI end" << endl;
}

/*
 * Class:     com_HelloWorldJNI
 * Method:    getBooleanFromJNI
 * Signature: ()Z
 */
JNIEXPORT jboolean JNICALL Java_com_HelloWorldJNI_getBooleanFromJNI(JNIEnv*,
		jobject) {
	cout << "JNI: getBooleanFromJNI  10" << endl;
	return (jboolean) 10;
}

/*
 * Class:     com_HelloWorldJNI
 * Method:    getBooleanArrayFromJNI
 * Signature: ()[Z
 */
JNIEXPORT jbooleanArray JNICALL Java_com_HelloWorldJNI_getBooleanArrayFromJNI(
		JNIEnv *env, jobject) {
	jboolean passwordProtected[] = { JNI_TRUE, JNI_FALSE, JNI_TRUE };
	jbooleanArray array = env->NewBooleanArray(10);
	env->SetBooleanArrayRegion(array, 0, 3, passwordProtected);
	return array;
}

/*
 * Class:     com_HelloWorldJNI
 * Method:    getIntArrayFromJNI
 * Signature: ()[I
 */
JNIEXPORT jintArray JNICALL Java_com_HelloWorldJNI_getIntArrayFromJNI(
		JNIEnv *env, jobject) {
	jint passwordProtected[] = { 100, 102, 104 };
	jintArray array = env->NewIntArray(10);
	env->SetIntArrayRegion(array, 0, 3, passwordProtected);
	return array;
}

/*
 * Class:     com_HelloWorldJNI
 * Method:    sendIntArrayToJNI
 * Signature: ([I)V
 */
JNIEXPORT void JNICALL Java_com_HelloWorldJNI_sendIntArrayToJNI(JNIEnv *env,
		jobject obj, jintArray array) {
	jsize size = env->GetArrayLength(array);
	jboolean a;
	jint *r = env->GetIntArrayElements(array, &a);
	for (int i = 0; i < size; i++) {
		cout << *r << endl;
		r++;
	}
}

/*
 * Class:     com_HelloWorldJNI
 * Method:    getIntField
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_com_HelloWorldJNI_getIntField(JNIEnv *env,
		jobject obj) {
	jclass helloClass = env->GetObjectClass(obj);
	jfieldID group = env->GetFieldID(helloClass, "groupId", "I");
	return env->GetIntField(obj, group);
}

/*
 * Class:     com_HelloWorldJNI
 * Method:    getStringField
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_HelloWorldJNI_getStringField(JNIEnv *env,
		jobject obj) {
	jclass helloClass = env->GetObjectClass(obj);
	jfieldID group = env->GetFieldID(helloClass, "topic", "Ljava/lang/String;");
	return (jstring) env->GetObjectField(obj, group);
}


使用以下命令生成so :

g++ -c -fPIC -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux com_HelloWorldJNI.cpp -o a.o
g++ -shared -fPIC -o libnative.so a.o -lc
sudo cp -rf libnative.so /usr/java/packages/lib/

然后运行最上面的测试代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值