java如何调用c 方法,Java从Java调用C ++方法

示例

Java中的静态方法和成员方法可以标记为本地方法,以指示在共享库文件中可以找到它们的实现。执行本机方法后,JVM使用简单的名称处理方案在已加载的库中查找相应的功能(请参阅加载本机库),执行参数转换和堆栈设置,然后将控制权移交给本机代码。

Java代码

/*** com/example/jni/JNIJava.java **/

package com.example.jni;

public class JNIJava {

static {

System.loadLibrary("libJNI_CPP");

}

// 显然,本机方法可能没有用Java定义的主体

public native void printString(String name);

public static native double average(int[] nums);

public static void main(final String[] args) {

JNIJava jniJava = new JNIJava();

jniJava.printString("Invoked C++ 'printString' from Java");

double d = average(new int[]{1, 2, 3, 4, 7});

System.out.println("Got result from C++ 'average': " + d);

}

}

C ++代码

包含本机函数声明的头文件应使用该javah工具在目标类上生成。在构建目录中运行以下命令:

javah -o com_example_jni_JNIJava.hpp com.example.jni.JNIJava

...产生以下头文件(为简洁起见,删除了注释):

// com_example_jni_JNIJava.hpp

/* DO NOT EDIT THIS FILE - it is machine generated */

#include  // JNI API声明

#ifndef _Included_com_example_jni_JNIJava

#define _Included_com_example_jni_JNIJava

#ifdef __cplusplus

extern "C" { // 如果使用C ++编译器,这是绝对必要的

#endif

JNIEXPORT void JNICALL Java_com_example_jni_JNIJava_printString

(JNIEnv *, jobject, jstring);

JNIEXPORT jdouble JNICALL Java_com_example_jni_JNIJava_average

(JNIEnv *, jclass, jintArray);

#ifdef __cplusplus

}

#endif

#endif

这是一个示例实现:

// com_example_jni_JNIJava.cpp

#include 

#include "com_example_jni_JNIJava.hpp"

using namespace std;

JNIEXPORT void JNICALL Java_com_example_jni_JNIJava_printString(JNIEnv *env, jobject jthis, jstring string) {

const char *stringInC = env->GetStringUTFChars(string, NULL);

if (NULL == stringInC)

return;

cout <

env->ReleaseStringUTFChars(string, stringInC);

}

JNIEXPORT jdouble JNICALL Java_com_example_jni_JNIJava_average(JNIEnv *env, jclass jthis, jintArray intArray) {

jint *intArrayInC = env->GetIntArrayElements(intArray, NULL);

if (NULL == intArrayInC)

return -1;

jsize length = env->GetArrayLength(intArray);

int sum = 0;

for (int i = 0; i 

sum += intArrayInC[i];

}

env->ReleaseIntArrayElements(intArray, intArrayInC, 0);

return (double) sum / length;

}输出结果

运行上面的示例类将产生以下输出:从Java调用C ++'printString'

得到C ++'average'的结果:3.4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值