昨夜闲潭梦落花

快速入门1. 设置环境变量windows下配置以下环境变量,以及JAVA的环境变量(不在此列出)PATHC:\MinGW\bin; LIBRARY_PATHC:\MinGW\lib C_INCLUDEDE_PATH C:\MinGW\include CPLUS_INCLUDE_PATH C:++\3.4.2;C:++\3.4.2++\3.4.2\backward;C:\MinGW\includeLinux下配置以下环境变量,要么配置到/etc/profile 里要么配置到用户目录的.bash_profile里export JAVA_HOME=/usr/lib/jvm/java-6-openjdk-amd64export PATH=$JAVA_HOME/bin:$PATHexport CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarexport LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH2. 编写Test.javaclass Test{{System.loadLibrary(“test”);}();(double x, double y);(String[] args){Test a = new Test();System.out.println(a.sum(3,5));a.display();}}3. 由Test.java自动生成Test.h$javah Test

注意不用在Test后跟上.java,否则会出错。 有可能报错:

error: cannot access Testclass file for Test not foundjavadoc: error – Class Test not found.Error: No classes were specified on the command line. Try -help.

此时需要先运行第6步,生成Test.class后才能用javah生成Test.h

4. 编写test.c#include “Test.h”#include “stdio.h”/* * Class:Test * Method: display * Signature: ()V */JNIEXPORT void JNICALL Java_Test_display (JNIEnv *env, jobject obj){printf(“hello world!\n”);}/* * Class:Test * Method: sum * Signature: (DD)D */JNIEXPORT jdouble JNICALL Java_Test_sum (JNIEnv * env, jobject obj, jdouble a, jdouble b){return a+b;}5. 编译成链接库windows:,test.dll test.clinux:/include libTest.so test.c

linux下可编写Makefile如下,可以实现C和C++的混编

CC = gcc)/)/include/linux -fPIC -shared -lstdc++LIBJNI_SO = libTest.soSRC_FILE = $(wildcard *.c *.cpp))) -o rm *.so6. 编译java$javac Test.java7. 运行$java Test8. 注意点

如果系统是64位的,java也是64位的,需要装64位的gcc。 装完要重新配置环境变量

JNI讲解0. 简介

JNIEnv *env代表的是当前的JNI环境,各种函数都要从这里调用。所有Java的本地函数对应的JNI函数,第一个参数都是JNIEnv *env,第二个参数是当前对象或者类。

1. C和C++区别

两者调用env的各种函数名都一样,但是C里的仅是个函数指针,比C++里多传一个参数就是env自己。 比如:

C里:jclass (JNICALL *FindClass)(JNIEnv *env, const char *name);`对应C++里:j;`

调用的时候:

C里:JNIEnv *env;(*env)->FindClass(env, “Result”);C++里: JNIEnv *env; env->FindClass(“Result”);

其他函数类似。

2. 函数名对应:

Java里函数对应的JNI函数名为Java_包名_类名_函数名_参数区分,最后面的参数区分只有在多个函数有相同函数名时才会出现。

3. 数据类型对应:1) 简单数据类型

Java JNI C

int jint int

double jdouble double

float jfloat float

boolean jboolean unsigned char 有两个常量:JNI_TRUE和JNI_FALSE分别对应1和0

String jstring char*

除了几个基本类型外,所有的类类型在JNI里对应的都是jobject类型。

2) String类型

jstring要转化成char*需要调用GetStringUTFChars 如:

jstring js;const char* str = env->GetStringUTFChars(js, 0);

记得在使用完以后,调用ReleaseStringUTFChars来释放内存

env->ReleaseStringUTFChars(js, str);

char*要转化成jstring需要调用NewStringUTF函数:

js = env->NewStringUTF(str);3) 类类型

类类型的对象一般都会变成jobject 比如: 成员函数第二个参数都是jobject,代表当前函数所在的对象:

JNIEXPORT jfloat JNICALL Java_Test_sum___3F(JNIEnv *env, jobject obj, jfloatArray arr)

除非是静态函数,第二个参数是jclass:

JNIEXPORT jobject JNICALL Java_Test_getDate(JNIEnv *env, jclass cls)I. 获取一个类类型

可以通过FindClass或者GetObjectClass来获取,前者需要传进去一个字符串, 注明包名和类名,后者需要传一个jobject:

j);jobject obj;j;II. 获取对象的成员变量

有如下方式:

jfieldID aFid = env->GetFieldID(curClass, “a”, “I”);int num = (int)env->GetIntField(obj, aFid);

GetFieldID第一个参数是jclass类型,第二个是变量名,第三个是变量类型的对应符,有以下几种:

Java类型 符号

boolean Z

byte B

char C

short S

int I

long L

float F

double D

void V

objects对象 Lfully-qualified-class-name; 注意此处要有分号

Arrays数组 [array-type

methods方法 (argument-types)return-type

GetIntField第一个参数是jobject,即需要处理的对象,第二个是jfieldID。返回int 同样有GetDoubleField、GetObjectField。

III. 改变成员变量

有如下方式:

env->SetIntField(obj, aFid, 30);

同样有SetDoubleField、SetObjectField。

IV. 调用对象的成员方法

有如下方式:

jmethodID getYearID = env->GetMethodID(dateClass, “getYear”, “()I”);jint year = env->CallIntMethod(date, getYearID);在旅途中,我遇见了你,你我相识是缘分!

昨夜闲潭梦落花

相关文章:

你感兴趣的文章:

标签云: