假设工作目录为/home
1. Java端
1) mkdir leixf & cd leixf
2) 创建SubClass.java文件,内容如下:
package leixf;
public class SubClass {
private String name = null;
public SubClass(String name){
this.name = name;
}
public void say(){
System.out.println("Hello " + this.name);
}
}
3) 创建Demo.java文件,内容如下:
package leixf;
public class Demo {
public static void main(String[] args) {
new Demo("Xiaofeng").myCall();
}
public Demo(){
//System.out.println("in default constructor");
this.name = "default";
//System.out.println("name is " + this.name);
}
private String name = null;
public Demo(String name){
//System.out.println("in special constructor");
this.name = name;
//System.out.println("name is " + this.name);
}
public void myCall(){
SubClass s = new SubClass(this.name);
s.say();
}
}
4) 编译文件,javac *.java
5) 查看方法签名,javap -classpath ./ -s Demo
2. C++端
1) 创建TestJNI.h文件,内容如下:
#ifndef _TESTJNI_
#define _TESTJNI_
#include
#include
#include
#include
#include
using namespace std;
class TestJNI
{
public:
TestJNI();
jstring NewJString(const char *str);
void say(string name);
private:
JavaVMOption options[1];
JNIEnv *env;
JavaVM *jvm;
JavaVMInitArgs vm_args;
long status;
};
#endif
2) 创建TestJNI.cpp文件,内容如下:
include "TestJNI.h"
TestJNI::TestJNI()
{
options[0].optionString = "-Djava.class.path=.";
vm_args.version = JNI_VERSION_1_2;
vm_args.nOptions = 1;
vm_args.options = options;
vm_args.ignoreUnrecognized = JNI_TRUE;
status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
}
jstring TestJNI::NewJString(const char *str)
{
if(status == JNI_ERR || str == NULL)
return 0;
jclass strClass = env->FindClass("Ljava/lang/String;");
jmethodID ctorID = env->GetMethodID(strClass, "", "([BLjava/lang/String;)V");
jbyteArray bytes = env->NewByteArray(strlen(str));
(env)->SetByteArrayRegion(bytes, 0, strlen(str), (jbyte*)str);
jstring encoding = env->NewStringUTF("GB2312");
return (jstring)(env)->NewObject(strClass, ctorID, bytes, encoding);
}
void TestJNI::say(string name)
{
if(status != JNI_ERR){
jclass cls = env->FindClass("leixf/Demo");
jmethodID mid = env->GetMethodID(cls, "", "(Ljava/lang/String;)V");
jstring arg = NewJString(name.c_str());
jobject demo = env->NewObject(cls, mid, arg);
mid = env->GetMethodID(cls, "myCall", "()V");
env->CallObjectMethod(demo, mid);
}
}
int main()
{
TestJNI test;
test.say("xiaofeng");
}
3) 编译生成可执行文件,g++ TestJNI.cpp -o test -I/usr/java/jdk1.6.0_30/include/ -I/usr/java/jdk1.6.0_30/include/linux -I/usr/java/jdk1.6.0_30/jre/lib/amd64//server/ -L/usr/java/jdk1.6.0_30/jre/lib/amd64/server/ -ljvm
3. 可能的错误
1) 错误
2) 问题定位
问题出现的原因可能是C++端未能找到Java类所在的位置,将*.class文件放在c++程序中指定的目录下即可