Java调用C++

Java调用C/C++大概有这样几个步骤:
编写带有native方法的Java类, 使用javac工具编译Java类
使用javah来生成与native方法对应的头文件

实现相应的头文件, 并编译为动态链接库(windows下是.dll, linux下是.so)


编写带有native方法的Java类

public class Sample {
    public native int intMethod(int n);
    public native boolean booleanMethod(boolean bool);
    public native String stringMethod(String text);
    public native int intArrayMethod(int[] intArray);
}

编译Sample.java, 生成Sample.class文件

javac Sample.java


使用javah生成头文件, 生成Sample.h文件

javah Sample


通过Sample.cpp文件实现Sample.h文件中定义的native方法

#include "Sample.h"
#include <string>
 
JNIEXPORT jint JNICALL Java_Sample_intMethod
  (JNIEnv *env, jobject obj, jint num)
{
    return num * num;
}
 
JNIEXPORT jboolean JNICALL Java_Sample_booleanMethod
  (JNIEnv *env, jobject obj, jboolean boolean)
{
    return !boolean;
}
 
JNIEXPORT jstring JNICALL Java_Sample_stringMethod
  (JNIEnv *env, jobject obj, jstring string)
{
    const char* str = env->GetStringUTFChars(string, 0);
    char cap[128];
    strcpy(cap, str);
    env->ReleaseStringUTFChars(string, 0);
    return env->NewStringUTF(strupr(cap));
}
 
JNIEXPORT jint JNICALL Java_Sample_intArrayMethod
  (JNIEnv *env, jobject obj, jintArray array)
{
    int i, sum = 0;
    jsize len = env->GetArrayLength(array);
    jint *body = env->GetIntArrayElements(array, 0);
     
    for (i = 0; i < len; ++i)
    {
        sum += body[i];
    }
    env->ReleaseIntArrayElements(array, body, 0);
    return sum;
}

编译Sample.cpp, 其中java头文件的目录根据编译机器进行修改, 生成Sample.o

g++ -I /usr/java/jdk1.7.0_21/include/ -I /usr/java/jdk1.7.0_21/include/linux/ -fPIC -c Sample.cpp


生成动态库文件,如果使用到其它对象文件(.o文件)以及动态连接库,则在Sample.o后面增加相应的参数

g++ -shared -Wl,-soname,libSample.so.1 -o libSample.so.1.0 Sample.o


设置动态库路径或拷贝到系统目录(/usr/lib或/usr/lib64)

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH


测试

public class TestSample {
    public static void main(String[] args) {
        System.loadLibrary("Sample");
        Sample sample = new Sample();
        int square = sample.intMethod(5);
        boolean bool = sample.booleanMethod(true);
        String text = sample.stringMethod("Java");
        int sum = sample.intArrayMethod(new int[]{1,2,3,4,5,8,13});
         
        System.out.println("intMethod: " + square);
        System.out.println("booleanMethod: " + bool);
        System.out.println("stringMethod: " + text);
        System.out.println("intArrayMethod: " + sum);
    }
}

参考文献:

使用JNI进行Java与C/C++语言混合编程(1)--在Java中调用C/C++本地库, 在Java中调用C/C++本地库



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值