linux 调用java,Linux下C++调用Java简单实例(jni)

假设工作目录为/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

0818b9ca8b590ca3270a3433284dd417.png

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) 错误

0818b9ca8b590ca3270a3433284dd417.png

2) 问题定位

问题出现的原因可能是C++端未能找到Java类所在的位置,将*.class文件放在c++程序中指定的目录下即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值