本地方法调用1
啊,好久没写blog了,更新还真是不适应。这个。。。话说,婚假回来,就一直没有感觉,虽然现在感觉也不是很好,但还是要hold住~
今天开始要搞一搞jni了,不然一年也屡不清原计划啊。
java的书从来都说的很好,100%纯java的解决方案是非常好的,但是,java性能真的还是不如c和c++。一般的辩解会是:网络io才是真正的瓶颈等等云云。ok,没错,但是(当然要有但是啦。一?这句话怎么这么熟?),java的速度确实不如c和c++,导致在很多时候,如用户响应上,确实有时会有不顺畅的感觉。当然,瑕不掩瑜,在很多时候,java还是非常强的,并且很难替代。
今天,先来一节入门篇,讲讲如何从java调到c函数的。
首先是native申明。
native声明一个方法后,就不用再写方法体了,因为实现是在下面进行。
来看看code:
class HelloNative{ public static native void greeting();}/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class HelloNative */#ifndef _Included_HelloNative#define _Included_HelloNative#ifdef __cplusplusextern "C" {#endif/* * Class: HelloNative * Method: greeting * Signature: ()V */JNIEXPORT void JNICALL Java_HelloNative_greeting (JNIEnv *, jclass);#ifdef __cplusplus}#endif#endif#include "HelloNative.h"#include <stdio.h>JNIEXPORT void JNICALL Java_HelloNative_greeting (JNIEnv* env, jclass cl){ printf("hello native world!\n");}extern "C"JNIEXPORT void JNICALL Java_HelloNative_greeting (JNIEnv* env, jclass cl){ cout<<"hello native world!"<<endl;}gcc -fPIC -I jdk/include -I jdk/include/linux -shared -o libHelloNative.so HelloNative.c
class HelloNativeTest{ static{ System.loadLibrary("HelloNative"); } public static void main(String[] args){ HelloNative.greeting(); }}
我知道原因了:jni.h的位置没有给正确。现在已经可以了! 我在编译so库的时候报以下错误:指点指点
我知道原因了:jni.h的位置没有给正确。现在已经可以了!