ubuntu下使用JNI Java调用C++的例子

Posted buyizhiyou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ubuntu下使用JNI Java调用C++的例子相关的知识,希望对你有一定的参考价值。

TestJNI.java

 1 public class TestJNI {
 2 
 3     static{
 4         System.load("/home/buyizhiyou/workspace/JNI/src/libTestJNI.so");//注意此处加载.so文件
 5     }
 6     public native String test(String inp);//此处需要声明
 7 
 8     public static void main(String[] args){
 9         TestJNI j=new TestJNI();
10         String ret=j.test("inputs");
11         System.out.println(ret);
12     }
13 }

javah -jni TestJNI 生成TestJNI.h,这个文件不用自己改,如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class TestJNI */

#ifndef _Included_TestJNI
#define _Included_TestJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     TestJNI
 * Method:    test
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_TestJNI_test
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

 然后用c++实现JNICALL Java_TestJNI_test方法,注意c++类型和JNI类型的转换:

#include "TestJNI.h"
#include<iostream>
using namespace std;
JNIEXPORT jstring JNICALL Java_TestJNI_test(JNIEnv * env, jobject, jstring inp)
{
        char* s = (char*)env->GetStringUTFChars(inp, NULL);
        cout<<s<<endl;
        jstring ret = env->NewStringUTF("return");
        return ret;
}

编译c++成.so文件,注意指定头文件路径,因为需要用到jni.h, jni_md.h:

g++ TestJNI.cpp  -I/usr/lib/jvm/java-8-oracle/include/linux/  -I/usr/lib/jvm/java-8-oracle/include/ -fPIC -shared -o libTestJNI.so

 

然后javac TestJNI.java编译,java TestJNI执行即可。

 

以上是关于ubuntu下使用JNI Java调用C++的例子的主要内容,如果未能解决你的问题,请参考以下文章

混合编程jni 第五篇之C++ 访问 Java代码

[JAVA]JNI之HelloWorld

JNI 通过多线程从 C++ 调用 Java

混合编程jni 第五篇之C++ 访问 Java代码

如何使用 JNI 从 JAVA 调用带有 C++ 参数的函数?

Java程序通过JNI调用C++程序的方法