java调用c++步骤

来源:互联网 发布:mac mini 换内存 编辑:程序博客网 时间:2024/06/12 01:34

  • 定义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
原创粉丝点击