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

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 <jni.h>
#include <iostream>
#include <stdlib.h>
#include <string.h>

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, "<init>", "([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, "<init>", "(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


c++代码和leixf目录是同级的。

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值