JNI_结合C资源和C++资源开发app
来源:互联网 发布:淘宝开店过程心得体会 编辑:程序博客网 时间:2024/05/31 06:22
JNI开发要做的环境搭建和开发流程:
1.为什么要使用jni?
C和C++,拥有Java所没有的一些特性,比如处理数据的效率,操作硬件的效率,C的效率是最快的;
2.怎么去调用C或C++的函数?
遵循Java和C的中间件,JNI规范,让Java和C进行互通交互;
3.开发当中需要什么工具和环境?
1. C或C++的编写,需要给eclipse安装cdt插件;
adt: android develop tools
cdt: c/c++ develop tools
2. C或C++的编译,需要安装开发工具集,NDK;
ndk: natvie develop kits 本地开发工具集 ( 交叉编译的工具链)
建议装在d盘根目录;
3. 使用NDK中的Linux脚本,需要安装一个Linux模拟环境,
1.装一个虚拟机,建议装置d盘根目录;
2. Cygwin 一个windows下 linux环境的模拟器
1.给虚拟机指定ndk-build的路径 /cygdrive/d/android-ndk-r7b/ndk-build
#在PATH中添加ndk-build的路径:/cygdrive/d/android-ndk-r7b
PATH="/usr/local/bin:/usr/bin:/cygdrive/d/android-ndk-r7b:${PATH}"
配置成功的体现:
Administrator@PC2012102114RDI ~
$ ndk-build
Android NDK: Could not find application project directory !
Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.
/cygdrive/d/android-ndk-r7b/build/core/build-local.mk:130: *** Android NDK: Aborting 。 停止。
4.在环境搭建好之后,怎么开发?走什么流程?
1.声明native方法
2.在classes目录下使用javah生产.h文件
3.创建jni目录,把.h文件拷贝过来;
4.在jni目录创建.c或.cpp文件;
5.在jni目录创建.mk文件,用于指定.so名称,以及原文件名称;
6.在项目目录下,允许ndk-build工具,自动生成.so文件,并且把.so文件放到该放的位置 libs/armeabi/libXXX.so
7.在java代码中的静态代码块中把.so加载进来;
C和C++的编写,数据类型,需要参照JNI规范:
参照 D:\android-ndk-r7b\platforms\android-8\arch-arm\usr\include 目录下的 jni.h 文件,该文件详细描述了Java和C/C++的中间类型;
规范了数据类型的声明,以及创建对象的方法,还有常用的方法;
.h文件:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class cn_itcast_cpp_DemoActivity */
#include"cn_itcast_cpp_DemoActivity.h"
#define _Included_cn_itcast_cpp_DemoActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: cn_itcast_cpp_DemoActivity
* Method: hellofromcpp
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_cn_itcast_cpp_DemoActivity_hellofromcpp
(JNIEnv *, jobject);
/*
* Class: cn_itcast_cpp_DemoActivity
* Method: helloInCpp
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_cn_itcast_cpp_DemoActivity_helloInCpp
(JNIEnv *, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif
.cpp文件:
#include<stdio.h>
#include"cn_itcast_cpp_DemoActivity.h"
#include <android/log.h>
#include<stdlib.h>
#include <malloc.h>
#define LOG_TAG "System.out"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
char* Jstring2CStr(JNIEnv* env, jstring jstr)
{
char* rtn = NULL;
jclass clsstring = env->FindClass("java/lang/String");
jstring strencode = (env)->NewStringUTF("GB2312");
jmethodID mid = (env)->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
jbyteArray barr= (jbyteArray)(env)->CallObjectMethod(jstr,mid,strencode); // String .getByte("GB2312");
jsize alen = (env)->GetArrayLength(barr);
jbyte* ba = (env)->GetByteArrayElements(barr,JNI_FALSE);
if(alen > 0)
{
rtn = (char*)malloc(alen+1); //"\0"
memcpy(rtn,ba,alen);
rtn[alen]=0;
}
(env)->ReleaseByteArrayElements(barr,ba,0); //
return rtn;
}
JNIEXPORT jstring JNICALL Java_cn_itcast_cpp_DemoActivity_hellofromcpp
(JNIEnv * env, jobject obj){
// return (*env)->NewStringUTF(env,"hello from c");
return env->NewStringUTF("hello form cpp");
}
JNIEXPORT void JNICALL Java_cn_itcast_cpp_DemoActivity_helloInCpp
(JNIEnv * env, jobject obj , jstring jstr){
char* cstr = Jstring2CStr(env,jstr);
LOGI("cstr=%s",cstr);
}
.mk文件:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#LOCAL_CPP_EXTENSION := cc
LOCAL_MODULE := Hello
LOCAL_SRC_FILES := Hello.cpp
LOCAL_LDLIBS += -llog
include $(BUILD_SHARED_LIBRARY)
- JNI_结合C资源和C++资源开发app
- JNI_结合C资源和C++资源开发app
- JNI_结合C资源和C++资源开发app
- C和C++资源
- C语言系统开发资源视频资源
- C资源
- C 资源
- C资源
- 链接和gnu C资源
- 跨平台编程资源,c & c++开发
- 跨平台编程资源,c & c++开发
- c/c++资源(源码,开发工具)
- c/c++资源(源码,开发工具)
- C#创建和使用资源文件
- C ++ 异常和资源自动回收
- (c#) 销毁资源和释放内存
- (c#) 销毁资源和释放内存
- C++/VC网上资源
- 两个序列的最长公共子序列
- Linux 2.6.36内核优化指南
- 图文理解C语言
- getElementById和getElementByName的区别
- 杂记之C语言的转义字符
- JNI_结合C资源和C++资源开发app
- UCI数据集和源代码&数据挖掘的数据集资源
- 程序员面试题精选100题(19)-反转链表[数据结构]
- 第17贴:音频功率放大集成电路
- 程序员面试题精选100题(33)-在O(1)时间删除链表结点[数据结构]
- 利用命令转换U盘格式
- 天天记录 - 使用VelocityTracker计算滑动速率
- linux mint
- Exchang2003+Win2003sp2 更改默认的数据库和日志路径(据说日志文件比较大)