国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > php开源 > 综合技术 > JNI实现HelloWorld

JNI实现HelloWorld

来源:程序员人生   发布时间:2015-05-15 08:03:54 阅读次数:2454次

1.下载NDK并解压

2.配置NDK的环境变量


3.打开eclipse,创建1个新项目,右击项目->Android tools->add Native Support...,创建1个.so文件(名字随意取)

4.点击Finish后,我们可以看到在项目的根目录下自动生成了1个JNI文件夹,里面有两个文件Andorid.mk和HelloWorld.cpp,

Adnorid.mk是makefile文件,1般是不需要我们改的,HelloWorld.cpp,看名字就知道是c++文件,我们Java层调用c++层,c++层就指的是这里面的HelloWorld.cpp。打开HelloWorld.cpp我们看到里面除1个#include <jni.h>头文件甚么也没有。好了!

我们先讲cpp放1下,等会再来编写函数,由于在这之前我们需要先定义java层的本地方法。

5.定义本地方法

/** * 声明本地方法 * 该方法为native方法.由CPP实现 * @return JNI 给出的信息 */ public native String getStringFromJNI(); /** * 载入JNI生成的so库文件 */ static { System.loadLibrary("HelloWorld"); }
声明本地方法需要注意两点:必须有native关键字,必须是抽象方法


6.编写.h文件

好了,java层的方法已声明,现在编写c++了,在编写c++之前,我们还需要创建1个.h文件,放在JNI目录中,.h文件学过c的应当知道里面可以引入头文件,函数声明。。。那末怎样生成.h文件呢?a.javac xx.java生成xx.class文件,b.javah -jni xx 就能够生成xx.h了,如果还不知道,创建1个.h文件,将下面的代码copy进去

/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> #include <string.h> /* Header for class HelloWorld */ #ifndef _Included_HelloWorld #define _Included_HelloWorld #ifdef __cplusplus extern "C" { #endif /* * Class: HelloWorld * Method: displayHelloWorld * Signature: ()V */ JNIEXPORT jstring JNICALL Java_com_example_helloworld_MainActivity_getStringFromJNI( JNIEnv* env,jobject thiz ); #ifdef __cplusplus } #endif #endif
JNIEXPORT jstring JNICALL Java_com_example_helloworld_MainActivity_getStringFromJNI( JNIEnv* env,jobject thiz );是函数声明,就是你在cpp创建的函数要声明1下


7.引入.h文件

#include "HelloWorld.h",好像是自定义的.h用" ",忘掉了!接着创建函数

jstring Java_com_example_helloworld_MainActivity_getStringFromJNI( JNIEnv* env,jobject thiz ) { //返回1个字符串给Java层 return (env)->NewStringUTF("HelloWorld from JNI !"); }

解释1下:jstring是返回的类型,.h声明函数的时候不要写错,函数名的编写是固定的Java_固定不变,后面是你的包名,+类名+方法名

在网上看到很多NewStringUTF出错,看了1下jni.h

jstring NewStringUTF(const char* bytes) { return functions->NewStringUTF(this, bytes); }

完全没必要return (*env)->NewStringUTF(env, "HelloWorld from JNI !");


好了!JNI已写好了,但是怎样生成.so文件呢??ctrl+B build的1下就好了,这是在libs中自动生成.so   文件


然后调用就好了

生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生