继上一篇,我们在native接口中编写了2个方法

生成的相应.h文件

这时,需要我们自己去完善.c文件

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
#include <android/log.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h> /* Header for class led_oki_com_jnidemo_AppJNI */ #ifndef _Included_led_oki_com_jnidemo_AppJNI
#define _Included_led_oki_com_jnidemo_AppJNI
#ifdef __cplusplus
extern "C" {
#endif 这段可不变,固定
#include "android/log.h" 
#define TAG "jnidemo-jni-test" // 这个是自定义的LOG的标识
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG,__VA_ARGS__) // 定义LOGD类型 这段主要是自定义的LOG标识,相当于Android中的LOG.D()方法 方法一:getStringFromNative
JNIEXPORT jstring JNICALL Java_com_oki_led_jni_AppJNI_getStringFromNative
(JNIEnv * env, jobject jObj){
LOGD("log string from ndk.");
return env->NewStringUTF(env,"Hello From JNI!");
} 这段,对应我们的native写的方法之一getStringFromNative,自定义的LOG使用则是使用自定义的方法名LOGD("提示内容")
这个方法意思是返回一个String类型的数据,数据是Hello From JNI!
在Android里就可以接收到这段String
AppJNI appJNI = new AppJNI();
String msg = appJNI.getStringFromNative();
这时,msg接收的数据就是Hello From JNI! 方法二:doCoordTest(COORD coord)
JNIEXPORT jobject JNICALL Java_com_oki_led_jni_AppJNI_doCoordTest
(JNIEnv *env, jobject obj, jobject coord) {
jclass coordClass = (*env)->GetObjectClass(env, coord);
if( coordClass){
jboolean iscopy;
jfieldID xId = (*env)->GetFieldID(env, coordClass, "x", "I");
jint x = (int)(*env)->GetIntField(env, coord, xId);
LOGD("x = %d", x); jfieldID yId = (*env)->GetFieldID(env, coordClass, "y", "I");
jint y = (int)(*env)->GetIntField(env, coord, yId);
LOGD("y = %d", y); jfieldID widthId = (*env)->GetFieldID(env, coordClass, "width", "I");
jint width = (int)(*env)->GetIntField(env, coord, widthId);
LOGD("width = %d", width); jfieldID heightId = (*env)->GetFieldID(env, coordClass, "height", "I");
jint height = (int)(*env)->GetIntField(env, coord, heightId);
LOGD("height = %d", height);
} jclass cls = (*env)->FindClass(env, "com/oki/led/jni/nativeobj/COORD");
jmethodID id = (*env)->GetMethodID(env, cls, "<init>", "()V"); jobject paramOut = (*env)->NewObjectA(env, cls, id, 0); return paramOut;
} 其中,COORD是在Android中创建的一个COORD对象类
public class COORD {
public int x;
public int y;
public int width;
public int height; /**
* 设置初始值
   * 为什么要设置初始值:防止在执行c文件中,数据出错或内容溢出等不必要的问题,也减少在c文件中对数据的判断,懒人方法(可用可不用)
*/
public COORD() {
x = 0;
y = 0;
width = 0;
height = 0;
}
}
如果native中设置的传递一个类,那么c文件中,一开始接收的数据应该是jobject类型,通过jobject类型转换成jclass类型,再取出class类中各个数值

jclass coordClass = (*env)->GetObjectClass(env, coord);

片段1:取值

//取类中的数值 x ID
jfieldID xId = (*env)->GetFieldID(env, coordClass, "x", "I");
//将 x ID 转换成相应类型的 x 数值
jint x = (int)(*env)->GetIntField(env, coord, xId);
//打印 x 数据,用于在Android运行过程中,判断该数值是否正确
LOGD("x = %d", x); 片段2:调用初始方法 //查找class 类 COORD
jclass cls = (*env)->FindClass(env, "com/oki/led/jni/nativeobj/COORD");
//对该类调用其初始化方法
jmethodID id = (*env)->GetMethodID(env, cls, "<init>", "()V");
//将cls类中的数据再转成jobject类    
jobject paramOut = (*env)->NewObjectA(env, cls, id, 0);
//将数据返回出去
return paramOut; 片段3:赋值 如果需要将片段1中的取值内容返回出去,需要再新创建一个jobject方法承载这些数据
//查找class 类 COORD
jclass cls = (*env)->FindClass(env, "com/oki/led/jni/nativeobj/COORD");
//可要可不要
jmethodID id = (*env)->GetMethodID(env, cls, "<init>", "()V");
//将cls类中的数据再转成jobject类    
jobject paramOut = (*env)->NewObjectA(env, cls, id, 0); jfieldID xId = (*env)->GetFieldID(env, coordClass, "x", "I");
//将xId赋值为3
(*env)->SetIntField(env, paramOut, xId, 3); return paramOut; 基本上就是这样,遗留问题:赋值是否有更方便的方法?里面是否有一些代码重复?

Android Studio中JNI -- 2 -- 编写c文件的更多相关文章

  1. Android studio中找不到so文件的问题:java.lang.UnsatisfiedLinkError

    解决Android studio中找不到so文件的问题:java.lang.UnsatisfiedLinkError 表示我们不编译jni代码,直接从libs里面复制so库 文件路径:app\buil ...

  2. Android Studio中JNI程序的单步调试和日志打印

    近日有个算法(检测碰撞)需要用C++实现,目的是IOS和ANDROID中共享同一段程序. 下面说说android调用这段程序过程中遇到的一些事情.(过程中网上搜索了一些相关文章,大部分说的是eclip ...

  3. android studio 中jni底层日志的打印

    1 添加ndk对log支持若需要添加ndk对log的支持,只需要通过以下2步即可实现. 1.1 修改Android.mk如生成的库文件是“.so文件”,则在Android.mk中添加如下内容:LOCA ...

  4. Android Studio中JNI -- 1 -- 配置方法

    1.配置NDK 1.1 下载NDK Android Studio 1.2 配 android-ndk-r10e,不同版本的Studio需要配置不同的ndk,下载完成后,随便解压放至某个文件目录下 1. ...

  5. Android Studio中新建和引用assets文件

    从eclipse转过的朋友们应该不太习惯AS中新建assets文件和对文件内容的引用.我也查找了网上很多资料发现很少有这样的解决答案,于是便把自己解决的方法总结在这里. 1.一般新建project后这 ...

  6. Android studio中2种build.gradle文件介绍

    根目录下的build.gradle通常不需要修改这个文件中的内容,除非需要添加一些全局的项目构建配置 buildscript { repositories { google() //声明代码托管仓库G ...

  7. 如何在Android Studio中创建jniLib和asset文件夹 2

    1.创建asset文件夹 如图进行操作 2.创建jniLib文件夹 —打开app下面的gradle文件(不是project的gradle) —在gradle文件的Android标签里面添加 sourc ...

  8. Android studio 中创建AIDL Service

      1.概述  AIDL在android系统中的作用 AIDL,Android Interface definition language的缩写,它是一种android内部进程通信接口的描写叙述语言, ...

  9. android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测

    目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. (原创:转载声明出处:http://www.cnblogs.com/lin ...

随机推荐

  1. 我所理解的 KMP(Knuth–Morris–Pratt) 算法

    假设要在 haystack 中匹配 needle . 要理解 KMP 先需要理解两个概念 proper prefix 和 proper suffix,由于找到没有合适的翻译,暂时分别称真实前缀 和 真 ...

  2. LR(1)表驱动语法分析设计图表

  3. Python运行机制

    闲来无事,简单画了一下Python的运行机制,纯属娱乐:

  4. oracle Imp和exp以及导入常见的错误

    一 1) 数据库对象已经存在 一般情况, 导入数据前应该彻底删除目标数据下的表, 序列, 函数/过程,触发器等; 数据库对象已经存在, 按缺省的imp参数, 则会导入失败 如果用了参数ignore=y ...

  5. 闪回还原点(Flashback Restore Point)

    Flashback Restore Point(闪回还原点) 闪回还原点分两种,一种是Normal Restore Points(正常还原点),另一种是Guaranteed Restore Point ...

  6. C# richTextBox封装的一个打印的类

    附件 http://files.cnblogs.com/xe2011/CSharpWinForm_richTextBoxPrintClass.rar 在窗体上一个Richtextbox 控件 和3个按 ...

  7. 使用QEMU调试Linux内核代码

    http://blog.chinaunix.net/uid-20729583-id-1884617.html http://www.linuxidc.com/Linux/2014-08/105510. ...

  8. Linux下Wireshark普通用户不能获取网络接口问题

    Linux下Wireshark普通用户不能获取网络接口问题 1.安装setcap, setcap 是libcap2-bin包的一部分,一般来说,这个包默认会已经装好. sudo apt-get ins ...

  9. 聊聊 KVC 和 KVO 的高阶应用

    KVC, KVO 作为一种魔法贯穿日常Cocoa开发,笔者原先是准备写一篇对其的全面总结,可网络上对其的表面介绍已经够多了,除去基本层面的使用,笔者跟大家谈下平常在网络上没有提及的KVC, KVO进阶 ...

  10. Ⅱ.AngularJS的点点滴滴--缓存

    模板缓存-$templateCache and 缓存工厂 $cacheFactory 1.使用script标签 <html ng-app> <script src="htt ...