下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年汽车维修工技能理论考试题库含完整答案(易错题)
- 2024年汽车维修工技能理论考试题库含答案(培优a卷)
- 2024年汽车维修工技能理论考试题库(巩固)
- 2024年汽车维修工技能理论考试题库附答案(培优b卷)
- 2024年沪教版六年级下册数学期末测试卷及参考答案【满分必刷】
- 2024年浙教版六年级下册数学期末测试卷附完整答案(夺冠)
- 2024年演出经纪人之演出经纪实务通关试题库(综合题)
- 2024年苏教版六年级下册数学期末测试卷【真题汇编】
- 2024年苏教版六年级下册数学期末测试卷及答案【必刷】
- 2024年苏教版六年级下册数学期末测试卷附答案【综合题】
- 卡拉OK仿真系统音频功率放大的设计
- 痛风中医临床路径.docx
- 综合楼工程施工组织设计毕业设计任务书
- MSA培训教程(完整版)
- 三级医院评审过关手册(超详细)
- 月之故乡F调 五线谱正谱 钢琴伴奏谱 高清晰
- 材料力学与结构力学visio模具下载
- 上海市单位退工证明退工单
- 第三讲三次样条函数ppt课件
- 南京英文介绍
- 医学影像学面试常见考题
评论
0/150
提交评论