【移动应用开发技术】Android ndk开发_第1页
【移动应用开发技术】Android ndk开发_第2页
【移动应用开发技术】Android ndk开发_第3页
【移动应用开发技术】Android ndk开发_第4页
【移动应用开发技术】Android ndk开发_第5页
免费预览已结束,剩余2页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】Androidndk开发

前言:我对C/C++是没有任何基础的,虽然大学中学了一个学期的C但是都算还给老师了。这篇文章是我做一个NDK项目积累下来的知识,可以说是一篇小白上手文章,所以高手请自行绕路。1、准备

做NDK开发是非常要注意开发环境和开发版本的(个人认为)。我使用的是Eclipse(Luna4.4.0),NDK版本r10,应该是在<=r6版本的NDK还需要安装cygwin(这这里就不讨论,网上大把资料),附上NDK的下载链接方便不能×××的朋友,32位

,64位,网站不能访问,但是直接用下载链接是可以下载到的。

安装好NDK后,就需要在Eclipse上进行配置了。

1、windows-preferences-android-ndk-ndklocation

选择ndk的安装目录

2、配置builder环境在需要进行ndk开发的项目上右键-properties-builder-new-program在出现的弹窗中做以下配置

3、右键项目工程Androidtools-AddNativeSupport

出现jni目录以及Android.mk,xx.cpp就说明添加成功了。就可以进行NDK开发了。2、Java调用C++中的方法。例如:获取从C++文件中获取字符串并打印在Activity类A中:static{

System.loadLibrary("xx");//xx是Android.mk文件中LOCAL_MODULE

的字段

}

//必须和ndk中的方法名一样

public

native

String

getString();

//onclick方法

public

void

click(View

v){

String

str

=

getString();

System.out.println("调用JNI中的方法:"+str);

}在ndk.cpp中#include

<jni.h>

#include<string.h>

/**

*

extern

"C"

是必须加的,经测试不加的话方法调用不成功,也没找到答案,有知道为什么的请*

告知,方法名称必须按照JNI的规范来Java_包名_类名_方法名,都必须以'_'隔开。

*/

extern

"C"

jstring

Java_com_test_ndk_A_getString(JNIEnv*

env,jobject

thiz){

jstring

str

;

//在C中的是以(*env)->调用的,网上大部分的博客文档也是这种情况。

str

=

env->newStringUTF("hello

world");//不能使用中文,不然会报错。

return

str;

}运行工程即可看到效果。3、C++中调用Java方法在ClassB中static{

System.loadLibrary("ndk");

}

public

native

void

loadJavaMethod();

public

void

f1(){

String

str

;

str

=

"hello

world

from

java";

System.out.println(str);

}

public

String

f2(){

String

str

;

str

=

"f2:

hello

world

from

java";

System.out.println(str);

return

str;

}

public

void

f3(String

str,int

i){

System.out.println("f3

内容为:"+str+",数字为:"+i);

}在ndk.cpp中#include

<jni.h>

#include<string.h>

extern

"C"

void

Java_com_test_ndk_B_loadJavaMethod(JNIEnv

*env,jobject

thiz){

//调用无参无返回值的方法

jclass

cls

=

env->GetObjectClass(thiz);

//GetMethodID("jclass对象","方法名","方法参数")

jmethodID

mID

=

env->GetMethodID(cls,"f1","()V");

if(mID

!=

NULL){

env->CallVoidMethod(thiz,mID);

}

//调用有参无返回值得方法

//参数类型除了基本数据类型外,其他的都需要按照这样的格式

//L包名/类名;

包名用/分割,必须以;结束

//详情请参考这篇文章

jclass

cls

=

env->GetObjectClass(thiz);

jmethodID

mID

=

env->GetMethodID(cls,"f3","(Ljava/lang/String;I)V");

jstring

content

=

env->NewStringUTF("hehe");

jint

i

=

10;

if(mID

!=

NULL){

env->CallVoidMethod(thiz,mID,content,i);

}

//调用有返回值无参的方法

jclass

cls

=

env->GetObjectClass(thiz);

jmethodID

mID

=

env->GetMethodID(cls,"f2","()Ljava/lang/String;");

if(mID

!=

NULL){

env->CallObjectMethod(thiz,mID);

}

//调用其他类中的方法假设有一个Student类,如果要使用Student类中的内部类A,格式为

//com/test/ndk/Student$A

jclass

stu

=

env->FindClass("com/test/ndk/Student");

//实例化无参构造方法

jobject

stuObj

=

env->NewObject(stu,env->GetMethodID(stu,"<init>","()V"));

jmethodID

getNameId

=

env->GetMethodID(stu,"getName","()V");

if(getNameId

!=NULL){

env->CallVoidMethod(stuObj,getNameId);

}

}4、在自己的so文件中调用第三方的so文件这种情况一般是因为第三方的C/C++中的方法不是按照JNI的规范来写,这时就需要进行重新包装,并使用,当然前提是有了第三方的说明文档。将第三方的so文件配置到预编译环境在工程的jni文件下新建prebuilt文件夹(名称随意)将第三方的so文件放到里面例如libthird.so,然后在这个文件夹下新建Androdid.mk文件,文件内容为LOCAL_PATH

:=

$(call

my-dir)

include

$(CLEAR_VARS)

LOCAL_MODULE

:=

libthird

LOCAL_SRC_FILES

:=

libthird.so

include

$(PREBUILT_SHARED_LIBRARY)打开jni下的Android.mk文件,加入以下字段LOCAL_PATH

:=

$(call

my-dir)

include

$(CLEAR_VARS)

LOCAL_MODULE

:=

ndk

LOCAL_SRC_FILES

:=

ndk.cpp

#名称和第三方mk中LOCAL_MODULE定义的名称一样

LOCAL_SHARED_LIBRARIES

:=

libthird

include

$(BUILD_SHARED_LIBRARY)

#添加路径

include

$(LOCAL_PATH)/prebuilt/Android.mk

配置完成后,在工程的libs\armeabi目录下可以看到第三方的so文件,注意不能直接将第三方的so文件放到这个目录下。否则在builde的时候会删除。假设在第三方的C/C++文件中有这样一个方法//extern

"C"在第三方的包中的方法也必须添加,测试时,如果不添加方法调用不成功,但这个是不能限//制到第三方的,有待解决

extern

"C"

int

f1(){

return

101;

}

在自己的C/C++文件中调用第三方的方法

#include

<jni.h>

#include

<dlfcn.h>

#include

<fcntl.h>

void

*filehandle

=

NULL;

jstring

(*f1)()

=NULL;

extern

"C"

jint

Java_com_test_ndk_classA_f1(JNIEnv

*

env,jobject

thiz){

jint

i

;

filehandle

=

dlopen("/data/data/com.fly.ndk2/lib/libndk.so",

RTLD_LAZY);

if(filehandle){

f1

=

(int(*)())dlsym(filehandle,"f1");

}

if(f1){

i

=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论