`

推荐--Linux平台下Java调用C函数(补充关于String类型函数返回值)

阅读更多
平台介绍
系统:ubuntu10.04
jdk:Java(TM) SE Runtime Environment (build 1.6.0_20-b02)
gcc:gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5


如上一篇博客写道的先是简单的调用,本篇则是进一步带返回值的调用。
gcc编译器会根据文件后缀名来识别C或C++程序,所以既然是java调用C语言则C语言部分的文件的后缀名要以.c结尾,否则编译时容易出问题。
本示例中本地方法生命为静态方法,如果不是静态方法则过程略有差异,不详细描述。
JNI关于字符串处理部分API
jstring NewStringUTF(JNIEnv* env,const char bytes[])
const jbyte* GetStringUTFChars(JNIEnv*env,jstring string,jboolen* isCopy)
void ReleaseStringUTFChars(JNIEnv*env,jstring string,const jbyte bytes[])
1.编写java native方法并编译
public class StringTest
{
    public static native String sayHello(String strName);
    static
    {
        System.loadLibrary("StringTest");
    }
}

java StringTest.java
2.用javah生成头文件
javah StringTest
3.编写C函数
#include "StringTest.h"
#include <stdio.h>
#include <string.h>
JNIEXPORT jstring JNICALL Java_StringTest_sayHello(JNIEnv * env, jclass cl, jstring instring)
{
    jstring result;
    const char *str = (*env)->GetStringUTFChars(env, instring, JNI_FALSE);
    printf("Native methods---Hello,%s\n",str);
    char * res;
    strcpy(res,str);
    result=(*env)->NewStringUTF(env, res);
    (*env)->ReleaseStringUTFChars(env, instring,str);
    return result;
}

4.编译c函数,生成lib文件

gcc -fPIC -I /usr/lib/jvm/java-6-sun/include/ -I /usr/lib/jvm/java-6-sun/include/linux/ -shared -o libStringTest.so StringTest.c
参数说明及易错部分提醒见上一篇日志
5.编写测试函数,编译并运行
public class Demo
{
    public static void main(String [] args)
    {
        String result = StringTest.sayHello("javaCallC");
        System.out.println("JavaMethod--"+result);
    }
}

编译:javac Demo.java
运行:java -Djava.library.path=. Demo(参数说明见上一篇博客)
6.程序结果

Native methods---Hello,javaCallC
JavaMethod--javaCallC

分享到:
评论

相关推荐

    Java调用MATLAB的实例

    ### Java调用MATLAB的实例知识点详解 #### 一、MATLAB函数的创建与封装 在本案例中,首先需要创建一个MATLAB函数`operation.m`来实现基本的数学运算功能,具体步骤如下: 1. **函数定义**: - 函数名为`...

    使用C++创建java虚拟机JVM,使用JNI调用java函数.zip

    本文将深入探讨如何使用C++创建Java虚拟机(JVM),并通过JNI来调用Java函数。这是一项技术性很强的任务,需要对C++编程、Java虚拟机的工作原理以及JNI接口有深入的理解。 首先,Java虚拟机(JVM)是Java平台的核心...

    JAVA如何调用dll:用JNI调用C或C++动态联接库

    总结来说,调用C或C++ DLL文件的主要步骤包括:准备DLL和JNative库,编写Java代码,使用JNative对象创建函数调用,并设置参数及返回值类型。最后,通过`invoke`方法执行函数并处理返回值。这种方法使得Java程序能够...

    [测试通过]JAVA调用第三方DLL的简单方法:JNA及DEMO

    首先,我们来看标题中的关键点:“JAVA调用第三方DLL的简单方法”。在Java中,由于其跨平台的特性,原生与操作系统交互并不直接,而JNA提供了一种桥接机制,使得Java可以直接调用Windows、Linux等操作系统中的DLL...

    JNative用java调用动态库VC++

    在这个场景中,我们关注的是JNative,一个简化Java调用C/C++库的开源库。 JNative 的优点在于它的易用性、数据类型处理的高效以及对回调函数的支持。在使用JNative之前,我们需要了解一些基本概念。例如,`...

    java调用DLL:JNative

    ### Java调用DLL:JNative概述 在Java项目中,有时候需要调用本地系统的动态链接库(DLL)来实现特定的功能。传统的做法是通过Java Native Interface (JNI)来进行调用,但这往往涉及到复杂的配置和繁琐的过程。为了...

    C-P-P-call-Java-classes.rar_c call java

    - **数据类型转换**:由于C++和Java的数据类型不完全相同,因此在传递参数和返回值时,需要正确地进行类型映射,例如,Java的`int`对应C++的`jint`,`String`对应`jstring`等。 - **线程安全**:Java是多线程的,而...

    针对Java程序调用RFC的API——JCo.docx

    以下是一个简单的示例,展示了如何使用JCo连接SAP系统并调用函数: ```java import com.sap.mw.jco.IFunctionTemplate; import com.sap.mw.jco.JCO; public class TestJCo { public static void main(String[] ...

    JNA调用.dll文件或.so动态链接库的代码demo

    Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接与本地操作系统API交互,无需编写C/C++的桥接代码。JNA提供了动态加载.dll(Windows)或.so(Linux/Unix)文件的能力,使得Java应用程序能够...

    Linux Apache Java Php介绍

    在这个例子中,`lajp_call`函数用于调用Java方法`hello.HelloClass::hello`。 **Java代码**: ```java package hello; public class HelloClass { public static final String hello(String userName) { return ...

    jna 3.3.0 java 调用 dll/so

    Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码无需编写C/C++的JNI(Java Native Interface)代码,即可直接调用操作系统底层的动态链接库(DLL on Windows, SO on Linux/Unix)。JNA 3.3.0是...

    迅雷下载接口java实现

    JNI是一种允许Java代码和其他语言写的代码进行交互的标准,它使得Java可以调用C/C++的函数,反之亦然。在本项目中,我们需要编写一个Java Native Interface的本地方法,通过这个方法,我们可以调用C++的迅雷接口。 ...

    java 使用JNA连接海康的硬盘录像机

    - JNA简介:JNA是一种开源库,允许Java程序直接调用C/C++库的函数,而不需要JNI(Java Native Interface)的复杂过程。 - 基本原理:JNA通过映射原生函数到Java方法来实现调用。它提供了Structure和Pointer等类来...

    jna-platform-4.3.0-API文档-中文版.rar

    - 基本数据类型映射:JNA将Java数据类型与C/C++的数据类型对应起来,例如int与int,String与char*等。 - FunctionMapper与TypeMapper:这两个接口用于自定义函数名和数据类型的映射规则。 2. JNA Platform 4.3.0...

    Java调用动态库最简便方法.pdf

    在跨语言开发中,Java调用其他语言(如C/C++)编写的动态链接库(DLL)是一种常见的需求。传统上,这种调用通常依赖于Java Native Interface (JNI),但这种方法涉及到较为复杂的步骤,包括编写C/C++代码、生成头文件...

    java中JNI调用非java(CC++)代码.pdf

    JNI调用本地方法时需要注意数据类型转换,例如Java的`String`在C/C++中对应的是`jstring`,需要使用JNI提供的API进行转换。同时,对于返回值和参数,也需要遵循JNI的数据类型规范进行处理。 通过以上步骤,我们...

    java jni 应用框架事例

    在Java中调用DLL的基本步骤包括加载DLL,创建并初始化指针,设置参数,调用函数,然后处理返回值。以下是一个简单的Java代码片段,展示了如何使用JNative调用DLL中的函数: ```java package onlyfun.dllcall; ...

    jna调用dll所需jar包

    JNA 提供了一种简单的方法来调用平台特定的函数,就像它们是Java方法一样,使得Java开发者能够轻松地访问系统资源,如DLL(动态链接库)在Windows系统中。 标题 "jna调用dll所需jar包" 指出,我们需要一些特定的JNA...

    JAVA如何调用dll:用JNI调用C或C++动态联接库原来如此简单[归类].pdf

    ### JAVA如何调用DLL:用JNI调用C或C++动态链接库详解 #### 一、引言 在跨语言编程领域中,Java Native Interface (JNI) 是一种强大的工具,它允许Java应用程序直接调用本地代码(如C或C++)。这种能力在处理性能...

    Jna调用动态库相关jar包

    例如,它包含了对Windows、Linux、macOS等各种平台的头文件和库的引用,使得JNA能够在不同的操作系统环境下正确地加载和调用本地库。 使用JNA进行动态库调用时,首先需要在Java代码中引入这两个jar包作为依赖。然后...

Global site tag (gtag.js) - Google Analytics