JAVA如何调用C函数 java中调用c语言函数

Java\u5982\u4f55\u8c03\u7528C\u8bed\u8a00\u4ee3\u7801 \uff1f

Java Native Interface\uff08JNI\uff09\u662fJava\u8bed\u8a00\u7684\u672c\u5730\u7f16\u7a0b\u63a5\u53e3\uff0c\u662fJ2SDK\u7684\u4e00\u90e8\u5206\u3002\u5728java\u7a0b\u5e8f\u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7JNI\u5b9e\u73b0\u4e00\u4e9b\u7528java\u8bed\u8a00\u4e0d\u4fbf\u5b9e\u73b0\u7684\u529f\u80fd\u3002\u901a\u5e38\u6709\u4ee5\u4e0b\u51e0\u79cd\u60c5\u51b5\u6211\u4eec\u9700\u8981\u4f7f\u7528JNI\u6765\u5b9e\u73b0\u3002 \u6807\u51c6\u7684java\u7c7b\u5e93\u6ca1\u6709\u63d0\u4f9b\u4f60\u7684\u5e94\u7528\u7a0b\u5e8f\u6240\u9700\u8981\u7684\u529f\u80fd\uff0c\u901a\u5e38\u8fd9\u4e9b\u529f\u80fd\u662f\u5e73\u53f0\u76f8\u5173\u7684 \u4f60\u5e0c\u671b\u4f7f\u7528\u4e00\u4e9b\u5df2\u7ecf\u6709\u7684\u7c7b\u5e93\u6216\u8005\u5e94\u7528\u7a0b\u5e8f\uff0c\u800c\u4ed6\u4eec\u5e76\u975e\u7528java\u8bed\u8a00\u7f16\u5199\u7684 \u7a0b\u5e8f\u7684\u67d0\u4e9b\u90e8\u5206\u5bf9\u901f\u5ea6\u8981\u6c42\u6bd4\u8f83\u82db\u523b\uff0c\u4f60\u9009\u62e9\u7528\u6c47\u7f16\u6216\u8005c\u8bed\u8a00\u6765\u5b9e\u73b0\u5e76\u5728java\u8bed\u8a00\u4e2d\u8c03\u7528\u4ed6\u4eec \u4e0b\u9762\u6211\u4eec\u5f00\u59cb\u7f16\u5199HelloWorld\u7a0b\u5e8f\uff0c\u7531\u4e8e\u6d89\u53ca\u5230\u8981\u7f16\u5199c/c++\u4ee3\u7801\u56e0\u6b64\u6211\u4eec\u4f1a\u5728\u5f00\u53d1\u4e2d\u4f7f\u7528Microsoft VC++\u5de5\u5177\u3002\u7f16\u5199java\u4ee3\u7801,\u6211\u4eec\u5728\u786c\u76d8\u4e0a\u5efa\u7acb\u4e00\u4e2ahello\u76ee\u5f55\u4f5c\u4e3a\u6211\u4eec\u7684\u5de5\u4f5c\u76ee\u5f55\uff0c\u9996\u5148\u6211\u4eec\u9700\u8981\u7f16\u5199\u81ea\u5df1\u7684java\u4ee3\u7801\uff0c\u5728java\u4ee3\u7801\u4e2d\u6211\u4eec\u4f1a\u58f0\u660enative\u65b9\u6cd5\uff0c\u4ee3\u7801\u975e\u5e38\u7b80\u5355\u3002\u5982\u4e0b\u6240\u793a class HelloWorld { public native void displayHelloWorld(); static { System.loadLibrary("hello"); } public static void main(String[] args) { new HelloWorld().displayHelloWorld(); } } \u6ce8\u610f\u6211\u4eec\u7684displayHelloWorld()\u65b9\u6cd5\u7684\u58f0\u660e\uff0c\u5b83\u6709\u4e00\u4e2a\u5173\u952e\u5b57native\uff0c\u8868\u660e\u8fd9\u4e2a\u65b9\u6cd5\u4f7f\u7528java\u4ee5\u5916\u7684\u8bed\u8a00\u5b9e\u73b0\u3002\u65b9\u6cd5\u4e0d\u5305\u62ec\u5b9e\u73b0\uff0c\u56e0\u4e3a\u6211\u4eec\u8981\u7528c/c++\u8bed\u8a00\u5b9e\u73b0\u5b83\u3002\u6ce8\u610fSystem.loadLibrary("hello")\u8fd9\u53e5\u4ee3\u7801\uff0c\u5b83\u662f\u5728\u9759\u6001\u521d\u59cb\u5316\u5757\u4e2d\u5b9a\u4e49\u7684\uff0c\u7cfb\u7edf\u7528\u6765\u88c5\u8f7dhello\u5171\u4eab\u5e93\uff0c\u8fd9\u5c31\u662f\u6211\u4eec\u5728\u540e\u9762\u751f\u6210\u7684hello.dll\uff08\u5982\u679c\u5728\u5176\u4ed6\u7684\u64cd\u4f5c\u7cfb\u7edf\u53ef\u80fd\u662f\u5176\u4ed6\u7684\u5f62\u5f0f\uff0c\u6bd4\u5982hello.so\uff09 \u7f16\u8bd1java\u4ee3\u7801 javac HelloWorld.java \u751f\u6210HelloWorld.class\u6587\u4ef6 \u521b\u5efa.h\u6587\u4ef6 \u8fd9\u4e00\u6b65\u4e2d\u6211\u4eec\u8981\u4f7f\u7528javah\u547d\u4ee4\u751f\u6210.h\u6587\u4ef6\uff0c\u8fd9\u4e2a\u6587\u4ef6\u8981\u5728\u540e\u9762\u7684c/c++\u4ee3\u7801\u4e2d\u7528\u5230\uff0c\u6211\u4eec\u8fd0\u884c javah HelloWorld\u3002\u8fd9\u6837\u6211\u4eec\u53ef\u4ee5\u770b\u5230\u5728\u76f8\u540c\u76ee\u5f55\u4e0b\u751f\u6210\u4e86\u4e00\u4e2aHelloWorld.h\u6587\u4ef6\uff0c\u6587\u4ef6\u5185\u5bb9\u5982\u4e0b \u5728\u6b64\u6211\u4eec\u4e0d\u5bf9\u4ed6\u8fdb\u884c\u592a\u591a\u7684\u89e3\u91ca\u3002 /* DO NOT EDIT THIS FILE - it is machine generated */ #include /* Header for class HelloWorld */ #ifndef _Included_HelloWorld #define _Included_HelloWorld #ifdef __cplusplus extern "C" { #endif /* * Class: HelloWorld * Method: displayHelloWorld * Signature: ()V */ JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif \u7f16\u5199\u672c\u5730\u5b9e\u73b0\u4ee3\u7801 \u5728\u8fd9\u90e8\u5206\u6211\u4eec\u8981\u7528C/C++\u8bed\u8a00\u5b9e\u73b0java\u4e2d\u5b9a\u4e49\u7684\u65b9\u6cd5\uff0c\u6211\u4eec\u5728VC++\u4e2d\u65b0\u5efa\u4e00\u4e2aProject,\u7136\u540e\u521b\u5efa\u4e00\u4e2aHelloWorldImp.cpp\u6587\u4ef6\uff0c\u5185\u5bb9\u5982\u4e0b #include #include "HelloWorld.h" #include JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj) { printf("Hello world!\n"); return; } \u6ce8\u610f\u6211\u4eec\u8fd9\u91ccinclude\u4e86 jni.h\u548c\u521a\u624d\u5f97\u5230\u7684HelloWorld.h\u6587\u4ef6\u3002\u56e0\u6b64\u4f60\u8981\u5728VC++\u91cc\u9762\u8bbe\u7f6e\u597d\uff0cjni.h\u5728JAVA_HOME/include\u91cc\u9762\u3002\u7f16\u8bd1\u901a\u8fc7\u540e\u518d\u751f\u6210hello.dll\u6587\u4ef6\u3002 \u8fd0\u884cjava\u7a0b\u5e8f \u628a\u4e0a\u9762\u751f\u6210\u7684hello.dll\u6587\u4ef6\u590d\u5236\u5230\u6211\u4eec\u7684\u5de5\u4f5c\u76ee\u5f55\uff0c\u8fd9\u65f6\u5019\u6211\u4eec\u7684\u76ee\u5f55\u4e2d\u5305\u62ecHelloWorld.java\uff0cHelloWorld.class\u548chello.dll\u6587\u4ef6\u3002\u8fd0\u884cjava HelloWorld\u547d\u4ee4\uff0c\u5219\u53ef\u5728\u63a7\u5236\u53f0\u770b\u5230Hello world| \u7684\u8f93\u51fa\u4e86\u3002\u8fd0\u884cVC++; \u6587\u4ef6\uff0d\uff0d\uff0d\u65b0\u5efa\uff0d\uff0d\uff0d\u9009\u201cwin32 console application\u201d\uff08\u63a7\u5236\u53f0\u7a0b\u5e8f\uff09\uff0d\uff0d\uff0d\u5728\u53f3\u65b9\u8bbe\u7f6e\u597d\u8def\u5f84\u5e76\u8f93\u5165\u5de5\u7a0b\u540d\uff0d\uff0d\uff0d\u786e\u5b9a \u63a5\u4e0b\u6765\u7684\u51e0\u4e2a\u63d0\u793a\u6846\u70b9\u786e\u5b9a\u5c31\u884c\u4e86\uff0c\u90a3\u662f\u63d0\u793a\u662f\u5426\u8981\u7528VC++\u63d0\u4f9b\u7684\u6846\u67b6\u4e4b\u7c7b\u7684 \u5728\u5de6\u8fb9\u7684\u5de5\u4f5c\u7a7a\u95f4\u4e2d\u9009\u201cFILEVIEW\u201d\u6807\u7b7e\u9879\uff0c\u70b9\u5f00\u201c\uff0b\u201d\u53f7\uff0c\u53f3\u952e\u70b9\u51fb\u201cSOURCE FILES\u201d,\u9009\u201c\u6dfb\u52a0\u6587\u4ef6\u5230\u76ee\u5f55\u201d\uff0c\u6b64\u5373\u6dfb\u52a0\u4f60\u8981\u5efa\u7acb\u7684C++\u6e90\u7a0b\u5e8f\u6587\u4ef6\uff0c\u4f1a\u63d0\u793a\u4f60\u6ca1\u6709\u6587\u4ef6\uff0c\u662f\u5426\u6dfb\u52a0\uff0c\u4f60\u70b9\u662f\uff0c\u8f93\u5165\u6587\u4ef6\u540d\u4fdd\u5b58\u5c31OK\u4e86 \u7136\u540eSOURCE FILES\u4e0b\u5c31\u51fa\u73b0\u4e86\u4f60\u521a\u624d\u5efa\u7acb\u7684\uff0a.CPP\u6587\u4ef6\uff0c\u53cc\u51fb\uff0c\u8f93\u5165\u4ee3\u7801. \u4ee5\u4e0b\u5c31\u662f\u70b9\u201d\u7ec4\u5efa\u201d\u83dc\u5355\u4e2d\u7684\u201d\u7f16\u8bd1\u201d\u3001\u201d\u7ec4\u5efa\u201d\u7b49\u547d\u4ee4\u8fdb\u884c\u8c03\u8bd5\u4e86\u3002 \u76f8\u4fe1\u4f60\u4f1a\u4e86\u3002 http://hi.baidu.com/%C7%E9%D4%B5and%D3%D1%D2%EA/blog/item/34084645e8560f23cefca3b7.html

\u8981\u5728java\u4e2d\u8c03\u7528c\u8bed\u8a00\u7684\u5e93,\u9700\u8981\u4f7f\u7528Java\u63d0\u4f9b\u4e86JNI\u3002
\u4e3e\u4f8b\u8bf4\u660e
\u5728c\u8bed\u8a00\u4e2d\u5b9a\u4e49\u4e00\u4e2a void sayHello()\u51fd\u6570(\u6253\u5370Hello World);\u7136\u540e\u5728Java\u4e2d\u8c03\u7528\u8fd9\u4e2a\u51fd\u6570\u663e\u793aHello Word.
\u73b0\u5728\u5206\u522b\u4eceJava\u548cC\u8bed\u8a00\u4e24\u90e8\u5206\u8bf4\u660e:
1. Java \u90e8\u5206
\u9996\u5148\u5b9a\u4e49\u4e00\u4e2aHelloNative,\u5728\u5176\u4e2d\u7533\u660esayHello\u51fd\u6570,\u51fd\u6570\u8981\u7533\u660e\u4e3aNative \u7c7b\u578b\u7684.\u5982\u4e0b:
public class HelloNative {
public native void sayHello();
}

\u7f16\u8bd1\u8fd9\u4e2a\u7c7b,\u751f\u6210class\u6587\u4ef6:
javac HelloWorld.java

\u5229\u7528javah\u751f\u6210\u9700\u8981\u7684h\u6587\u4ef6
javah HelloNative

\u751f\u6210\u7684 h\u6587\u4ef6\u5927\u6982\u5982\u4e0b:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class HelloNative */

#ifndef _Included_HelloNative
#define _Included_HelloNative
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloNative
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloNative_sayHello
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

\u53ef\u4ee5\u770b\u4e00\u4e0b\u4e0a\u9762\u81ea\u52a8\u751f\u6210\u7684\u7a0b\u5e8f,\u7a0b\u5e8finclude\u4e86jni.h,\u8fd9\u4e2a\u5934\u6587\u4ef6\u5728 $JAVA_HOME\u4e0b\u7684include\u6587\u4ef6\u5939\u4e0b. \u8fd8\u53ef\u4ee5\u53d1\u73b0\u751f\u6210\u7684\u51fd\u6570\u540d\u662f\u5728\u4e4b\u524d\u7684\u51fd\u6570\u540d\u524d\u9762\u52a0\u4e0a\u4e86Java_HelloNative\u3002
2. C\u8bed\u8a00\u90e8\u5206
\u6839\u636e\u4e0a\u9762\u751f\u6210\u7684h\u6587\u4ef6\u7f16\u5199\u76f8\u5e94\u7684\u4ee3\u7801\u5b9e\u73b0,\u5efa\u7acb\u4e00\u4e2a HelloNative.cpp\u7528\u6765\u5b9e\u73b0\u663e\u793aHello World\u7684\u51fd\u6570.\u5982\u4e0b:

#include
#include "HelloNative.h"

JNIEXPORT void JNICALL Java_HelloNative_sayHello(JNIEnv *, jobject)
{
printf("Hello World!\n");
}

\u4ee3\u7801\u7f16\u5199\u5b8c\u6210\u4e4b\u540e,\u6211\u4eec\u518d\u7528gcc\u7f16\u8bd1\u6210\u5e93\u6587\u4ef6,\u547d\u4ee4\u5982\u4e0b;
gcc -fPIC -I/usr/lib/jvm/java-7-openjdk-i386/include -I/usr/lib/jvm/java-7-openjdk-i386/include/linux -shared -o libHelloNative.so HelloNative.cpp

\u8fd9\u6837\u5c31\u4f1a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2alibHelloNative.so\u7684\u5e93\u6587\u4ef6.\u8fd9\u65f6\u9700\u8981\u7684\u5e93\u5df2\u7ecf\u751f\u6210,\u5728C\u8bed\u8a00\u4e0b\u7684\u5de5\u4f5c\u5df2\u7ecf\u5b8c\u6210\u4e86.
\u63a5\u4e0b\u6765\u9700\u8981\u5728Java\u4e2d\u7f16\u5199\u4e00\u4e2a\u7a0b\u5e8f\u6d4b\u8bd5\u4e00\u4e0b.\u5728\u7a0b\u5e8f\u524d,\u9700\u8981\u5c06\u6211\u4eec\u7684\u5e93\u8f7d\u5165\u8fdb\u53bb.\u8f7d\u5165\u7684\u65b9\u6cd5\u662f\u8c03\u7528Java\u7684 System.loadLibrary("HelloNative");

public class TestNative
{
static {
try {
System.loadLibrary("HelloNative");
}
catch(UnsatisfiedLinkError e) {
System.out.println( "Cannot load hello library:\n " + e.toString() );
}
}
public static void main(String[] args) {
HelloNative test = new HelloNative();
test.sayHello();
}
}

\u4f46\u662f\u518d\u7f16\u8bd1\u540e,\u8fd0\u884c\u7684\u65f6\u5019,\u95ee\u9898\u53c8\u51fa\u73b0\u4e86.
Cannot load hello library:
java.lang.UnsatisfiedLinkError: no HelloNative in java.library.path
Exception in thread "main" java.lang.UnsatisfiedLinkError: HelloNative.sayHello()V
at HelloNative.sayHello(Native Method)
at TestNative.main(TestNative.java:13)

\u8f7d\u5165\u5e93\u5931\u8d25,\u4f46\u662f\u5e93\u660e\u660e\u5c31\u662f\u653e\u5728\u5f53\u524d\u6587\u4ef6\u5939\u4e0b\u7684,\u600e\u4e48\u4f1a\u8f7d\u5165\u5931\u8d25\u5462?
\u7528System.getProperty("java.library.path")\u67e5\u770b,\u53d1\u73b0java.library.path\u4e2d\u5e76\u4e0du\u5b58\u5728\u5f53\u524d\u7684\u76ee\u5f55.\u4e3b\u8981\u6709\u4ee5\u4e0b\u7684\u51e0\u4e2a\u89e3\u51b3\u529e\u6cd5:
1) \u5c06\u751f\u6210\u7684\u5e93\u590d\u5236\u5230java.library.path\u6709\u7684\u8def\u5f84\u4e2d\u53bb,\u5f53\u7136\u8fd9\u6837\u4e0d\u662f\u5f88\u597d
2) \u8bbe\u7f6e\u73af\u5883\u53d8\u91cfexport LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ,\u5c06\u5f53\u524d\u7684\u76ee\u5f55\u52a0\u5165\u5230LD_LIBRARY_PATH\u4e2d
3) \u8bbe\u7f6ejava \u7684\u9009\u9879,\u5c06\u5f53\u524d\u7684\u76ee\u5f55\u52a0\u5165\u5230\u5176\u4e2d .java -Djava.library.path=. $LD_LIBRARY_PATH
\u8fd9\u6837\u4e4b\u540e\u7a0b\u5e8f\u5c31\u80fd\u591f\u6210\u529f\u7684\u8fd0\u884c\u4e86.\u53ef\u4ee5\u770b\u89c1\u663e\u793a\u7684"Hello World!"\u4e86

要在java中调用c语言的库,需要使用Java提供了JNI。
举例说明
在c语言中定义一个 void sayHello()函数(打印Hello World);然后在Java中调用这个函数显示Hello Word.
现在分别从Java和C语言两部分说明:
1. Java 部分
首先定义一个HelloNative,在其中申明sayHello函数,函数要申明为Native 类型的.如下:
public class HelloNative {
public native void sayHello();
}

编译这个类,生成class文件:
javac HelloWorld.java

利用javah生成需要的h文件
javah HelloNative

生成的 h文件大概如下:

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

#ifndef _Included_HelloNative
#define _Included_HelloNative
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloNative
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloNative_sayHello
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

可以看一下上面自动生成的程序,程序include了jni.h,这个头文件在 $JAVA_HOME下的include文件夹下. 还可以发现生成的函数名是在之前的函数名前面加上了Java_HelloNative。
2. C语言部分
根据上面生成的h文件编写相应的代码实现,建立一个 HelloNative.cpp用来实现显示Hello World的函数.如下:

#include <stdio.h>
#include "HelloNative.h"

JNIEXPORT void JNICALL Java_HelloNative_sayHello(JNIEnv *, jobject)
{
printf("Hello World!\n");
}

代码编写完成之后,我们再用gcc编译成库文件,命令如下;
gcc -fPIC -I/usr/lib/jvm/java-7-openjdk-i386/include -I/usr/lib/jvm/java-7-openjdk-i386/include/linux -shared -o libHelloNative.so HelloNative.cpp

这样就会在当前目录下生成一个libHelloNative.so的库文件.这时需要的库已经生成,在C语言下的工作已经完成了.
接下来需要在Java中编写一个程序测试一下.在程序前,需要将我们的库载入进去.载入的方法是调用Java的 System.loadLibrary("HelloNative");

public class TestNative
{
static {
try {
System.loadLibrary("HelloNative");
}
catch(UnsatisfiedLinkError e) {
System.out.println( "Cannot load hello library:\n " + e.toString() );
}
}
public static void main(String[] args) {
HelloNative test = new HelloNative();
test.sayHello();
}
}

但是再编译后,运行的时候,问题又出现了.
Cannot load hello library:
java.lang.UnsatisfiedLinkError: no HelloNative in java.library.path
Exception in thread "main" java.lang.UnsatisfiedLinkError: HelloNative.sayHello()V
at HelloNative.sayHello(Native Method)
at TestNative.main(TestNative.java:13)

载入库失败,但是库明明就是放在当前文件夹下的,怎么会载入失败呢?
用System.getProperty("java.library.path")查看,发现java.library.path中并不u存在当前的目录.主要有以下的几个解决办法:
1) 将生成的库复制到java.library.path有的路径中去,当然这样不是很好
2) 设置环境变量export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ,将当前的目录加入到LD_LIBRARY_PATH中
3) 设置java 的选项,将当前的目录加入到其中 .java -Djava.library.path=. $LD_LIBRARY_PATH
这样之后程序就能够成功的运行了.可以看见显示的"Hello World!"了

  • JAVA濡備綍璋冪敤C鍑芥暟
    绛旓細瑕佸湪java涓皟鐢╟璇█鐨勫簱,闇瑕佷娇鐢↗ava鎻愪緵浜咼NI銆俓x0d\x0a涓句緥璇存槑\x0d\x0a鍦╟璇█涓畾涔変竴涓獀oidsayHello()鍑芥暟(鎵撳嵃HelloWorld);鐒跺悗鍦Java涓皟鐢杩欎釜鍑芥暟鏄剧ずHelloWord.\x0d\x0a鐜板湪鍒嗗埆浠嶫ava鍜孋璇█涓ら儴鍒嗚鏄:\x0d\x0a1.Java閮ㄥ垎\x0d\x0a棣栧厛瀹氫箟涓涓狧elloNative,鍦ㄥ叾涓敵鏄巗ayHello...
  • Java濡備綍璋冪敤C璇█浠g爜 ?
    绛旓細濡備笅鎵绀 class HelloWorld { public native void displayHelloWorld(); static { System.loadLibrary("hello"); } public static void main(String[] args) { new HelloWorld().displayHelloWorld(); } } 娉ㄦ剰鎴戜滑鐨刣isplayHelloWorld()鏂规硶鐨勫0鏄庯紝瀹冩湁涓涓叧閿瓧native锛岃〃鏄庤繖涓柟娉曚娇鐢java浠ュ鐨璇...
  • JAVA濡備綍璋冪敤C璇█鎺ュ彛?
    绛旓細绗竴锛jni鏂瑰紡璋冪敤c鎺ュ彛銆傞氳繃灏哻璇█鎺ュ彛灏佽涓簀ni鐨勬柟寮忕洿鎺ヤ緵java璇█璋冪敤锛岃繖涓彲浠ヨ鏄渶鎯敤鐨勬柟寮忋傜浜岋紝jna鏂瑰紡璋冪敤c鎺ュ彛銆俲na涔熸槸鍏朵腑涓绉嶈皟鐢╟鎺ュ彛鐨勬柟寮忋備娇鐢ㄦ椂鍙互鍔犺浇鍔ㄦ佸簱.dll鎴.so锛岀劧鍚庤皟鐢ㄥ簱涓殑鎺ュ彛銆傜涓夛紝濡傛灉c鎺ュ彛寰堢畝鍗曪紝鍙互灏哻鎺ュ彛缂栬瘧涓哄彲鎵ц绋嬪簭锛屼娇鐢╦ava鐩存帴璋冪敤鍙墽琛...
  • java鎬庝箞寮曠敤c
    绛旓細鍏蜂綋璋冪敤姝ラ濡備笅锛1.棣栧厛鍒涘缓Java鏂囦欢 HelloJni.java 锛屽苟鍒涘缓native鏂规硶銆2.缂栬瘧Java鏂囦欢骞剁敓鎴恓ava澶存枃浠躲3.鍒涘缓C璇█鏂囦欢锛孒elloWorld.c銆4.鐢熸垚鍔ㄦ侀摼鎺ュ簱鏂囦欢 libhello.so銆5.璁剧疆鍔ㄦ侀摼鎺ュ簱鏂囦欢鐨勭洰褰曘6.鎶婂垰鎵嶇敓鎴愮殑so鏂囦欢鎷疯礉鍒/home/lib涓嬶紝鐒跺悗鎵цclass鏂囦欢銆
  • 浠涔堟牱鐨勬妧鏈兘璁java璋冪敤c璇█鐨勪唬鐮
    绛旓細java琚紪璇戞垚瀛楄妭鐮佸悗鐢盝VM瑙i噴鎵ц锛宩ava瑕佽皟鐢–璇█鍐欑殑绋嬪簭锛岄偅涔堝氨蹇呴』閫氳繃JVM璋冪敤锛宩ava鍛婅瘔JVM鎴戣璋冪敤鏈湴鎿嶄綔绯荤粺鐨勯偅涓▼搴忔锛堝dll锛夊苟瑕佹眰杩斿洖涓涓粨鏋溿傞氳繃JVM璋冪敤鏈湴绋嬪簭鐨勬妧鏈氨鏄疛NI锛宩ava Native interface(鏈湴鎺ュ彛鎶鏈)銆俲ava鏄氳繃铏氭嫙鏈哄疄鐜拌法骞冲彴鎶鏈殑锛屽洜姝よ璋冪敤鏈湴鎿嶄綔绯荤粺...
  • java濡備綍璋冪敤c绋嬪簭
    绛旓細涓銆侀鍏堥渶瑕佺紪鍐欎竴涓猲ative鐨刯ava鏂规硶銆俻ublic class Test{ static{System.loadLibrary("mydll");}public static void main(String[] args) {new Test().test();}public native void test();}浜 浣跨敤javac 缂栬瘧銆備娇鐢╦avah鐢熶骇澶存枃浠躲傜敓浜х殑澶存枃浠跺氨鍦ㄤ綘鎵ц杩欎簺鍛戒护鐩綍涓嬮潰銆備笁銆佺紪鍐C浠g爜...
  • java鐢╦na璋冪敤C璇█dll鎺ュ彛涓殑鍥炶皟鍑芥暟鎬庝箞鍐
    绛旓細绠鍗曠殑浣犱細鍐欙紝閭e氨濂藉姙锛岀洿鎺ヤ笂浠g爜 public interface TestAPI extends StdCallLibrary { interface LoginReply extends StdCallCallback { /** * 鐧诲綍鍥炶皟 */ void invoke(String userId, long retCode, String retMsg); } /** * 娉ㄥ唽涓涓櫥褰曞洖璋冩柟娉.姝ゆ柟娉曟槸dll鎻愪緵鐨...
  • 鎬庝箞鐢JAVA璋冪敤C鐨凟XE绋嬪簭骞朵笖瀹炵幇绋嬪簭鑷姩杈撳叆
    绛旓細import java.io.*;import java.lang.*;import java.nio.charset.*;public class Rt { public static void main(String[] args) throws Exception { if( args.length == 0 ) { System.out.println("鐢ㄦ硶: java Rt <鐩爣EXE> <鎻愪緵缁橢XE鐨勫弬鏁...>");return;} Runtime rt = Runtime.get...
  • 鐢Java鎬庝箞璋冪敤C璇█宸茬粡缂栧啓濂界殑DLL?
    绛旓細{ return x > y ? x : y; } 澶囨敞: A 鍏朵腑鐨刯ni.h閫氬父鍦 jdk\include\ 鍙互鍏堟嫹璐濆埌VC瀹夎鐩綍涓嬬殑include鐩綍涓.涓鍔虫案閫,浠ュ悗鍙互鏂逛究浣跨敤JNI鎶鏈. B 鍏ㄩ儴鐨勬暟鎹被鍨嬮渶瑕佽冭檻Java鍜孷C鐨勬帴鍙i棶棰.鐢╦int jstring 绛. C 鍑芥暟鍚嶇О鍜岃嚜鍔ㄧ敓鎴愮殑.h鏂囦欢涓瀹氱殑涓鑷.鍛藉悕瑙勫垯鏄: Java_浣跨敤绫籣...
  • 鍏充簬JAVA璋冪敤C鐨凞LL搴撲腑鐨鍑芥暟闂,浼犲叆涓涓惈鏈夋寚閽堢殑缁撴瀯浣撴寚閽坃鐧惧害...
    绛旓細鍦java閲屽畾涔夊搴旂殑锛屽垎閰嶅湴鍧绌洪棿澶у皬鐩稿悓鐨勭粨鏋勪綋銆俲ava搴旇涔熷彲浠ュ畾涔塻truct.姣斿dword鍙互瀹氫箟涓簂ong.鎶奵涓殑pvoid瀹氫箟鎵惧嚭鏉ワ紝涔熷畾涔変竴涓猻truct.
  • 扩展阅读:java调用自定义函数 ... java主函数调用子函数 ... java中怎么调用函数 ... js调用java函数 ... java怎么调用函数方法 ... java找不到main函数 ... java调用void函数 ... java输出函数 ... java中调用pow函数 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网