现在的位置: 首页 > 综合 > 正文

java调用c++步骤

2014年01月17日 ⁄ 综合 ⁄ 共 1245字 ⁄ 字号 评论关闭

  • 定义java与c的接口

package com.test;

public class Test 
{
public static native String test(int a); 
}

  • 基于上步定义的接口,生成c的头文件

javah -classpath ./ -jni com.test.Test
生成c的头文件:com_test_Test.h 

  • 基于c的头文件,实现和封装

com_test_Test.cpp
#include "com_test_Test.h"
#include <stdlib.h>
#include <string.h>

jstring stoJstring(JNIEnv* env, const char* pat)
{
        jclass strClass = env->FindClass("Ljava/lang/String;");
        jmethodID ctorID = env->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");
        jbyteArray bytes = env->NewByteArray(strlen(pat));
        env->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*)pat);
        jstring encoding = env->NewStringUTF("utf-8");

        return (jstring)env->NewObject(strClass, ctorID, bytes, encoding);

jstring JNICALL Java_com_test_Test_test(JNIEnv * p, jclass c, jint a)
{
        char buf[32] = {0}; 
        sprintf(buf,"input is %d" , a);

        return stoJstring(p , buf);
}

  • 生成对应的c库

g++ -fPIC -D_REENTRANT -I/usr/lib/jvm/java-1.5.0-sun-1.5.0.19/include -I/usr/lib/jvm/java-1.5.0-sun-1.5.0.19/include/linux -c com_test_Test.cpp
g++ -shared com_test_Test.o -o libtest.so

  • 设置环境变量

export LD_LIBRARY_PATH=/root/test

  • 编写测试文件

package com.test;

public class Main 
{
public static void main(String args [])
{
System.loadLibrary("test");

System.out.println("output:" + Test.test(100));
}
}

  • 运行测试

java -Djava.library.path=. -jar Test.jar
java -Djava.library.path=. com.test.Test

抱歉!评论已关闭.