平台介绍
系统: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的实例知识点详解 #### 一、MATLAB函数的创建与封装 在本案例中,首先需要创建一个MATLAB函数`operation.m`来实现基本的数学运算功能,具体步骤如下: 1. **函数定义**: - 函数名为`...
本文将深入探讨如何使用C++创建Java虚拟机(JVM),并通过JNI来调用Java函数。这是一项技术性很强的任务,需要对C++编程、Java虚拟机的工作原理以及JNI接口有深入的理解。 首先,Java虚拟机(JVM)是Java平台的核心...
总结来说,调用C或C++ DLL文件的主要步骤包括:准备DLL和JNative库,编写Java代码,使用JNative对象创建函数调用,并设置参数及返回值类型。最后,通过`invoke`方法执行函数并处理返回值。这种方法使得Java程序能够...
首先,我们来看标题中的关键点:“JAVA调用第三方DLL的简单方法”。在Java中,由于其跨平台的特性,原生与操作系统交互并不直接,而JNA提供了一种桥接机制,使得Java可以直接调用Windows、Linux等操作系统中的DLL...
在这个场景中,我们关注的是JNative,一个简化Java调用C/C++库的开源库。 JNative 的优点在于它的易用性、数据类型处理的高效以及对回调函数的支持。在使用JNative之前,我们需要了解一些基本概念。例如,`...
### Java调用DLL:JNative概述 在Java项目中,有时候需要调用本地系统的动态链接库(DLL)来实现特定的功能。传统的做法是通过Java Native Interface (JNI)来进行调用,但这往往涉及到复杂的配置和繁琐的过程。为了...
- **数据类型转换**:由于C++和Java的数据类型不完全相同,因此在传递参数和返回值时,需要正确地进行类型映射,例如,Java的`int`对应C++的`jint`,`String`对应`jstring`等。 - **线程安全**:Java是多线程的,而...
以下是一个简单的示例,展示了如何使用JCo连接SAP系统并调用函数: ```java import com.sap.mw.jco.IFunctionTemplate; import com.sap.mw.jco.JCO; public class TestJCo { public static void main(String[] ...
Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接与本地操作系统API交互,无需编写C/C++的桥接代码。JNA提供了动态加载.dll(Windows)或.so(Linux/Unix)文件的能力,使得Java应用程序能够...
在这个例子中,`lajp_call`函数用于调用Java方法`hello.HelloClass::hello`。 **Java代码**: ```java package hello; public class HelloClass { public static final String hello(String userName) { return ...
Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码无需编写C/C++的JNI(Java Native Interface)代码,即可直接调用操作系统底层的动态链接库(DLL on Windows, SO on Linux/Unix)。JNA 3.3.0是...
JNI是一种允许Java代码和其他语言写的代码进行交互的标准,它使得Java可以调用C/C++的函数,反之亦然。在本项目中,我们需要编写一个Java Native Interface的本地方法,通过这个方法,我们可以调用C++的迅雷接口。 ...
- JNA简介:JNA是一种开源库,允许Java程序直接调用C/C++库的函数,而不需要JNI(Java Native Interface)的复杂过程。 - 基本原理:JNA通过映射原生函数到Java方法来实现调用。它提供了Structure和Pointer等类来...
- 基本数据类型映射:JNA将Java数据类型与C/C++的数据类型对应起来,例如int与int,String与char*等。 - FunctionMapper与TypeMapper:这两个接口用于自定义函数名和数据类型的映射规则。 2. JNA Platform 4.3.0...
在跨语言开发中,Java调用其他语言(如C/C++)编写的动态链接库(DLL)是一种常见的需求。传统上,这种调用通常依赖于Java Native Interface (JNI),但这种方法涉及到较为复杂的步骤,包括编写C/C++代码、生成头文件...
JNI调用本地方法时需要注意数据类型转换,例如Java的`String`在C/C++中对应的是`jstring`,需要使用JNI提供的API进行转换。同时,对于返回值和参数,也需要遵循JNI的数据类型规范进行处理。 通过以上步骤,我们...
在Java中调用DLL的基本步骤包括加载DLL,创建并初始化指针,设置参数,调用函数,然后处理返回值。以下是一个简单的Java代码片段,展示了如何使用JNative调用DLL中的函数: ```java package onlyfun.dllcall; ...
JNA 提供了一种简单的方法来调用平台特定的函数,就像它们是Java方法一样,使得Java开发者能够轻松地访问系统资源,如DLL(动态链接库)在Windows系统中。 标题 "jna调用dll所需jar包" 指出,我们需要一些特定的JNA...
### JAVA如何调用DLL:用JNI调用C或C++动态链接库详解 #### 一、引言 在跨语言编程领域中,Java Native Interface (JNI) 是一种强大的工具,它允许Java应用程序直接调用本地代码(如C或C++)。这种能力在处理性能...
例如,它包含了对Windows、Linux、macOS等各种平台的头文件和库的引用,使得JNA能够在不同的操作系统环境下正确地加载和调用本地库。 使用JNA进行动态库调用时,首先需要在Java代码中引入这两个jar包作为依赖。然后...