关于Android NDK
把解压后的ndk放在自己想放的位置
环境变量:ndk根目录添加到PATH=$PATH:<ndk-root-path>
使用NDK:在自己工作目录(可以是随意位置)下创建<Test>目录,然后在<Test>目录下创建jni目录,在jni下面创建Android.mk文件和C程序文件。
下面是Android.mk文件内容(不是定的)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := CheckNetInfoJni // 模块名,最后生成libCheckNetInfoJni.so
LOCAL_SRC_FILES := CheckNetInfo.c // C程序文件
LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog // 使用utils/log.h头文件
include $(BUILD_SHARED_LIBRARY)
关于C文件里面的JNI_OnLoad函数:
首先是额外的两个头文件需要加进来,android/Log.h文件后面再说
#include <jni.h>
#include "android/Log.h"
写JNINativeMethod数组:
static const JNINativeMethod gMethods[] = {
{"getNetInfoFromApnic","()Ljava/lang/String;",(void*)JNI_getNetInfoFromApnic},
};
函数签名是一个字符串:"(M)N",括号中的内容是函数的参数类型,括号后面表示函数的返回值。
具体的每一个字符的对应关系如下
字符 Java类型 C类型
V void void
Z jboolean boolean
I jint int
J jlong long
D jdouble double
F jfloat float
B jbyte byte
C jchar char
S jshort short
数组则以”["开始,用两个字符表示
[I jintArray int[]
[F jfloatArray float[]
[B jbyteArray byte[]
[C jcharArray char[]
[S jshortArray short[]
[D jdoubleArray double[]
[J jlongArray long[]
[Z jbooleanArray boolean[]
如果Java函数的参数是class,则以”L”开头,以”;”结尾,中间是用”/” 隔开的包及类名。而其对应的C函数名的参数则为jobject
一个例外是String类,其对应的类为jstring
Ljava/lang/String; String jstring
Ljava/net/Socket; Socket jobject
--------------------------------------------------------------
static const JNINativeMethod gMethods[] = {
{"getNetInfoFromApnic","()Ljava/lang/String;",(void*)JNI_getNetInfoFromApnic},
};
static int regeisterMethods(JNIEnv * env){
jclass class;
static const char * const kClassName = "com/lml/jni/CheckNetInfoJni";
class = (*env)->FindClass(env,kClassName);
if(class==NULL){
return JNI_FALSE;
}
if((*env)->RegisterNatives(env,class,gMethods,sizeof(gMethods)/sizeof(gMethods[0]))!=JNI_OK){
return JNI_FALSE;
}
return JNI_TRUE;
}
jint JNI_OnLoad(JavaVM * vm, void * reserved){
JNIEnv * env = NULL;
jint result = -1;
if((*vm)->GetEnv(vm,(void**)&env,JNI_VERSION_1_4)!=JNI_OK){
goto fail;
}
assert(env!=NULL);
if(regeisterMethods(env)<0){
goto fail;
}
result = JNI_VERSION_1_4;
fail:
return result;
}
——————————————————————————————————————————————
关于androidlog.h
#include <android/log.h>
#ifndef LOG
#define LOG "PCSC JNI Debug Infor"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG, __VA_ARGS__) //定义LOGD类型
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG,__VA_ARGS__) //定义LOGI类型
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN, LOG, __VA_ARGS__) //定义lOGW类型
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG, __VA_ARGS__) //定义LOGE类型
#define LOGF(...) __android_log_print(ANDROID_LOG_FATAL, LOG, __VA_ARGS__) //定义LOGF类型
#endif
关于Android NDK的更多相关文章
- Android NDK debug 方法
最近又频繁遇到 NDK 的错误,记录一下debug调试的一些经验,以备后续查看 一般来说,在Android Studio中的Monitor中将过滤器的 LOG TAG 设置为 "DEBUG& ...
- Android NDK开发Hello Word!
在之前的博客中已经为大家介绍了,如何在win环境下配置DNK程序,本篇我将带大家实现一个简单的Hello jni程序,让大家真正感受一下NDK开发的魅力.这里我们选择使用C+JAVA开发Android ...
- Android NDK开发初识
神秘的Android NDK开发往往众多程序员感到兴奋,但又不知它为何物,由于近期开发应用时,为了是开发的.apk文件不被他人解读(反编译),查阅了很多资料,其中有提到使用NDK开发,怀着好奇的心理, ...
- android NDK debug 遇到的问题与解决方法
最近在研究android NDK 的eclipse调试,遇到点问题,总结一下: 1.Unknown Application ABI :在application.mk里面添加APP_PLATFORM ...
- 初识Android NDK
本文介绍Windows环境下搭建Android NDK开发环境,并创建一个简单的使用Native代码的Android Application. 一.环境搭建 二.JNI函数绑定 三.例子 一.环境搭建 ...
- Android SDK Android NDK Android Studio 官方下载地址
2016.12 Android Studio Windows Includes Android SDK https://dl.google.com/dl/android/studio/install/ ...
- Android NDK之JNI陷阱
背景: 最近一个月一直在做移植库的工作,将c代码到share library移植到Android平台.这就涉及到Android NDK(native develop kit)内容.这里只想记录下JNI ...
- Android NDK开发
Android NDK 开发教程(极客学院) 一.Android NDK环境搭建 使用最新ndk,直接抛弃cygwin,以前做Android的项目要用到NDK就必须要下载NDK,下载安装Cygwin( ...
- Eclipse+CDT+GDB调试android NDK程序(转)
Eclipse+CDT+gdb调试android ndk程序 先介绍一下开发环境,在这个环境下,up主保证是没有问题的. ubuntu 11.10 eclipse 3.7(indego) for ja ...
- android NDK入门 windows下安装cygwin
一.Android NDK环境简介 Android NDK 是运行于Android 平台上的Native Development Kit 的缩写. Android 应用开发者可以通过NDK 调用C 或 ...
随机推荐
- PNG在IE6下背景问题
png24.min.js 源代码: var DD_belatedPNG={ns:"DD_belatedPNG",imgSize:{},delay:10,nodesFixed:0,c ...
- 【HDU 4992】 Primitive Roots (原根)
Primitive Roots Description We say that integer x, 0 < x < n, is a primitive root modulo n i ...
- 通过live555实现H264 RTSP直播
http://blog.csdn.net/firehood_/article/details/16844397
- 利用TEA算法进行数据加密
TEA(Tiny Encryption Algorithm)是一种小型的对称加密解密算法,最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计. ...
- leetcode面试准备: Substring with Concatenation of All Words
leetcode面试准备: Substring with Concatenation of All Words 1 题目 You are given a string, s, and a list o ...
- GCC优化选项-fomit-frame-pointer对于esp和ebp优化的作用
我的博客:www.while0.com -fomit-frame-pointer选项是发布产品时经常会用到的优化选项,它可以优化汇编函数中用edp协助获取堆栈中函数参数的部分,不使用edp,而是通过计 ...
- lsof 拥有更多的功能
lsof 拥有更多的功能# lsof -i 看系统中有哪些开放的端口,哪些进程.用户在使用它们,比 netstat -lptu 的输出详细. # lsof -i 4 查看IPv4类型的进程COMMA ...
- cocos2d-x 添加自定义字体---中文,英文
1: 找到字体 xxx.ttf 2: 在xcode工程的 Info.plist文件中添加key Fonts provided by application, 或者 UIAppFonts(raw ...
- 基于.NET平台的分层架构实战(六)——依赖注入机制及IoC的设计与实现[转]
原文:http://www.cnblogs.com/leoo2sk/archive/2008/06/19/1225223.html 我们设计的分层架构,层与层之间应该是松散耦合的.因为是单向单一调用, ...
- HDOJ/HDU 1242 Rescue(经典BFS深搜-优先队列)
Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is ...