首先是主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/
然后运行最上面的测试代码。