java中调用c语言函数 Java如何调用C语言代码 ?

JAVA\u5982\u4f55\u8c03\u7528C\u51fd\u6570

\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 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

要在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!"了

LZ看看百科中的例子吧
书写步骤  ·编写带有native声明的方法的java类
·使用javac命令编译所编写的java类
JNI
·使用javah ?jni java类名生成扩展名为h的头文件
·使用C/C++实现本地方法
·将C/C++编写的文件生成动态连接库
·ok
1) 编写java程序:这里以HelloWorld为例。
代码1:
class HelloWorld {
public native void displayHelloWorld();//所有native关键词修饰的都是对本地的声明
static {
System.loadLibrary("hello"); //载入本地库
}
public static void main(String[] args) {
new HelloWorld().displayHelloWorld();
}
}
声明native方法:如果你想将一个方法做为一个本地方法的话,那么你就必须声明该方法为native的,并且不能实现。其中方法的参数和返回值在后面讲述。 Load动态库:System.loadLibrary("hello");加载动态库(我们可以这样理解:我们的方法 displayHelloWorld()没有实现,但是我们在下面就直接使用了,所以必须在使用之前对它进行初始化)这里一般是以static块进行加载的。同时需要注意的是System.loadLibrary();的参数“hello”是动态库的名字。
2) 编译
没有什么好说的了 javac HelloWorld.java
3) 生成扩展名为h的头文件 javah ?
jni HelloWorld 头文件的内容: /* DO NOT EDIT THIS FILE - it is machine generated */
1. include
/* Header for class HelloWorld */
1. ifndef _Included_HelloWorld
2. define _Included_HelloWorld
JNI
3. ifdef __cplusplus
extern "C" {
1. endif
/*
* Class: HelloWorld
* Method: displayHelloWorld
* Signature: ()V
* /
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject);
1. ifdef __cplusplus
}
1. endif
2. endif
(这里我们可以这样理解:这个h文件相当于我们在java里面的接口,这里声明了一个 Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject);方法,然后在我们的本地方法里面实现这个方法,也就是说我们在编写C/C++程序的时候所使用的方法名必须和这里的一致)。
4) 编写本地方法实现和由javah命令生成的头文件里面声明的方法名相同的方法。
代码2:
1 #include "jni.h"
2 #include "HelloWorld.h"
JNI
3 //#include other headers
4 JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
printf("Hello world!\n");
return;
}
注意代码2中的第1行,需要将jni.h(该文件可以在%JAVA_HOME%/include文件夹下面找到)文件引入,因为在程序中的JNIEnv、 jobject等类型都是在该头文件中定义的;另外在第2行需要将HelloWorld.h头文件引入(我是这么理解的:相当于我们在编写java程序的时候,实现一个接口的话需要声明才可以,这里就是将HelloWorld.h头文件里面声明的方法加以实现。当然不一定是这样)。然后保存为 HelloWorldImpl.c就ok了。
5) 生成动态库
这里以在Windows中为例,需要生成dll文件。在保存HelloWorldImpl.c文件夹下面,使用VC的编译器cl成。 cl -I%java_home%\include -I%java_home%\include\win32 -LD HelloWorldImp.c -Fehello.dll 注意:生成的dll文件名在选项-Fe后面配置,这里是hello,因为在HelloWorld.java文件中我们loadLibary的时候使用的名字是hello。当然这里修改之后那里也需要修改。另外需要将-I%java_home%\include -I%java_home%\include\win32参数加上,因为在第四步里面编写本地方法的时候引入了jni.h文件。
6) 运行程序 java HelloWorld就ok.

如果你是在命令行中,也可以直接CLS。如果你是在Eclipse控制台中,右键明确

如果你是在命令行中,也可以直接CLS。如果你是在Eclipse控制台中,右键明确

千万千万千万千万去问问千万千万

  • Java濡備綍璋冪敤C璇█浠g爜 ?
    绛旓細鏂规硶涓嶅寘鎷疄鐜帮紝鍥犱负鎴戜滑瑕佺敤c/c++璇█瀹炵幇瀹冦傛敞鎰廠ystem.loadLibrary("hello")杩欏彞浠g爜锛屽畠鏄湪闈欐佸垵濮嬪寲鍧椾腑瀹氫箟鐨勶紝绯荤粺鐢ㄦ潵瑁呰浇hello鍏变韩搴擄紝杩欏氨鏄垜浠湪鍚庨潰鐢熸垚鐨刪ello.dll锛堝鏋滃湪鍏朵粬鐨勬搷浣滅郴缁熷彲鑳芥槸鍏朵粬鐨勫舰寮忥紝姣斿hello.so锛 缂栬瘧java浠g爜 javac HelloWorld.java 鐢熸垚HelloWorld.class鏂囦欢 ...
  • java濡備綍璋冪敤c璇█婧愭枃浠跺苟鎵ц?
    绛旓細瑕佸湪java涓皟鐢╟璇█鐨勫簱,闇瑕佷娇鐢↗ava鎻愪緵浜咼NI銆俓x0d\x0a涓句緥璇存槑\x0d\x0a鍦╟璇█涓畾涔変竴涓 void sayHello()鍑芥暟(鎵撳嵃Hello World);鐒跺悗鍦↗ava涓皟鐢ㄨ繖涓嚱鏁版樉绀篐ello Word.\x0d\x0a鐜板湪鍒嗗埆浠嶫ava鍜孋璇█涓ら儴鍒嗚鏄:\x0d\x0a1. Java 閮ㄥ垎\x0d\x0a棣栧厛瀹氫箟涓涓狧elloNative,鍦ㄥ叾涓...
  • JAVA濡備綍璋冪敤C璇█鎺ュ彛?
    绛旓細绗竴锛宩ni鏂瑰紡璋冪敤c鎺ュ彛銆傞氳繃灏c璇█鎺ュ彛灏佽涓簀ni鐨勬柟寮忕洿鎺ヤ緵java璇█璋冪敤锛岃繖涓彲浠ヨ鏄渶鎯敤鐨勬柟寮忋傜浜岋紝jna鏂瑰紡璋冪敤c鎺ュ彛銆俲na涔熸槸鍏朵腑涓绉嶈皟鐢╟鎺ュ彛鐨勬柟寮忋備娇鐢ㄦ椂鍙互鍔犺浇鍔ㄦ佸簱.dll鎴.so锛岀劧鍚庤皟鐢ㄥ簱涓殑鎺ュ彛銆傜涓夛紝濡傛灉c鎺ュ彛寰堢畝鍗曪紝鍙互灏哻鎺ュ彛缂栬瘧涓哄彲鎵ц绋嬪簭锛屼娇鐢╦ava鐩存帴璋冪敤鍙墽琛...
  • 浠涔堟牱鐨勬妧鏈兘璁java璋冪敤c璇█鐨勪唬鐮
    绛旓細java琚紪璇戞垚瀛楄妭鐮佸悗鐢盝VM瑙i噴鎵ц锛宩ava瑕璋冪敤C璇█鍐欑殑绋嬪簭锛岄偅涔堝氨蹇呴』閫氳繃JVM璋冪敤锛宩ava鍛婅瘔JVM鎴戣璋冪敤鏈湴鎿嶄綔绯荤粺鐨勯偅涓▼搴忔锛堝dll锛夊苟瑕佹眰杩斿洖涓涓粨鏋溿傞氳繃JVM璋冪敤鏈湴绋嬪簭鐨勬妧鏈氨鏄疛NI锛宩ava Native interface(鏈湴鎺ュ彛鎶鏈)銆俲ava鏄氳繃铏氭嫙鏈哄疄鐜拌法骞冲彴鎶鏈殑锛屽洜姝よ璋冪敤鏈湴鎿嶄綔绯荤粺鐩...
  • java鐢╦na璋冪敤C璇█dll鎺ュ彛涓殑鍥炶皟鍑芥暟鎬庝箞鍐
    绛旓細public interface TestAPI extends StdCallLibrary { interface LoginReply extends StdCallCallback { /** * 鐧诲綍鍥炶皟 */ void invoke(String userId, long retCode, String retMsg); } /** * 娉ㄥ唽涓涓櫥褰曞洖璋冩柟娉.姝ゆ柟娉曟槸dll鎻愪緵鐨 */ void RegisterLoginReply(...
  • 鐢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璇█涓鐨刦scanf鍑芥暟
    绛旓細鍑芥暟鍚: fscanf 鍔 鑳: 浠庝竴涓祦涓墽琛屾牸寮忓寲杈撳叆,fscanf閬囧埌绌烘牸鍜屾崲琛屾椂缁撴潫锛屾敞鎰忕┖鏍兼椂涔熺粨鏉熴傝繖涓巉gets鏈夊尯鍒紝fgets閬囧埌绌烘牸涓嶇粨鏉熴 杩斿洖鍊硷細鏁村瀷锛屾垚鍔熻繑鍥炶鍏ョ殑鍙傛暟鐨勪釜鏁帮紝澶辫触杩斿洖EOF(-1)銆
  • 鍦java涓濡備綍浣跨敤鍍C璇█涓scanf();杈撳叆鍑芥暟
    绛旓細瀵煎叆java.util.Scanner鍖 Scanner input = new Scanner(System.in); String s = input.next(); //Scanner 瀵硅薄鏈塶extXxx()鏂规硶,,濡傛灉鏄帴鍙梚nt绫诲瀷灏辨槸input.nextInt();
  • Java鏍稿績鎶鏈鍏増(2)涓Java璋冪敤C鍑芥暟JNI鐨勪緥瀛,閫氳繃javah鐢熸垚C璇█...
    绛旓細JNICALL琛ㄧず璋冪敤绾﹀畾锛岀浉褰撲簬C++鐨剆tdcall锛岃鏄庤皟鐢ㄧ殑鏄湰鍦版柟娉 JNIEXPORT琛ㄧず鍑芥暟鐨勯摼鎺ユ柟寮忥紝褰撶▼搴忔墽琛岀殑鏃跺欎粠鏈湴搴撴枃浠朵腑鎵惧嚱鏁
  • C璇█涓鐨"鍑芥暟鎸囬拡鏁扮粍"鍦java涓鎬庝箞瀹炵幇?
    绛旓細java涓嶆敮鎸佹寚閽堬紝涔熶笉鏀寔鍦ㄧ被澶栧畾涔夊嚱鏁帮紝鎵浠ュ鏋滀綘鍦java閲杩欎箞鍋氭槸娌℃湁鎰忎箟鐨勶紝杩欎笉绗﹀悎java鐨勬濇兂銆傚鏋滀綘闈炶鎶婇噸鐐规斁鍦ㄥ嚱鏁颁笂锛屼綘鍙互鍦ㄧ被閲屽畾涔夊嚱鏁帮紝鐒跺悗浠庣被闂存帴璋冪敤鍑芥暟銆
  • 扩展阅读:初学编程必背50个 ... java编程免费教程 ... java自学要学多久 ... java中怎么调用函数 ... 入门的java游戏小程序 ... c++和java哪个好就业 ... python基础代码大全 ... java 函数调用方法 ... java三种调用方法格式 ...

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