Android Studio中JNI -- 2 -- 编写c文件
继上一篇,我们在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文件的更多相关文章
- Android studio中找不到so文件的问题:java.lang.UnsatisfiedLinkError
解决Android studio中找不到so文件的问题:java.lang.UnsatisfiedLinkError 表示我们不编译jni代码,直接从libs里面复制so库 文件路径:app\buil ...
- Android Studio中JNI程序的单步调试和日志打印
近日有个算法(检测碰撞)需要用C++实现,目的是IOS和ANDROID中共享同一段程序. 下面说说android调用这段程序过程中遇到的一些事情.(过程中网上搜索了一些相关文章,大部分说的是eclip ...
- android studio 中jni底层日志的打印
1 添加ndk对log支持若需要添加ndk对log的支持,只需要通过以下2步即可实现. 1.1 修改Android.mk如生成的库文件是“.so文件”,则在Android.mk中添加如下内容:LOCA ...
- Android Studio中JNI -- 1 -- 配置方法
1.配置NDK 1.1 下载NDK Android Studio 1.2 配 android-ndk-r10e,不同版本的Studio需要配置不同的ndk,下载完成后,随便解压放至某个文件目录下 1. ...
- Android Studio中新建和引用assets文件
从eclipse转过的朋友们应该不太习惯AS中新建assets文件和对文件内容的引用.我也查找了网上很多资料发现很少有这样的解决答案,于是便把自己解决的方法总结在这里. 1.一般新建project后这 ...
- Android studio中2种build.gradle文件介绍
根目录下的build.gradle通常不需要修改这个文件中的内容,除非需要添加一些全局的项目构建配置 buildscript { repositories { google() //声明代码托管仓库G ...
- 如何在Android Studio中创建jniLib和asset文件夹 2
1.创建asset文件夹 如图进行操作 2.创建jniLib文件夹 —打开app下面的gradle文件(不是project的gradle) —在gradle文件的Android标签里面添加 sourc ...
- Android studio 中创建AIDL Service
1.概述 AIDL在android系统中的作用 AIDL,Android Interface definition language的缩写,它是一种android内部进程通信接口的描写叙述语言, ...
- android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测
目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. (原创:转载声明出处:http://www.cnblogs.com/lin ...
随机推荐
- Hdu 4311-Meeting point-1 曼哈顿距离,前缀和
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4311 Meeting point-1 Time Limit: 2000/1000 MS (Java/Oth ...
- admin-openrc
#!/bin/bash # To use an Openstack cloud you need to authenticate against keystone, which # returns a ...
- JVM 的 工作原理,层次结构 以及 GC工作原理
JVM Java 虚拟机 Java 虚拟机(Java virtual machine,JVM)是运行 Java 程序必不可少的机制.JVM实现了Java语言最重要的特征:即平台无关性.原理:编译后的 ...
- Theano FCN实现与训练经验与教训小结
NaN 计算softmax loss时要用numeric robust 的计算方式. softmax与 loss可能要分开计算. 得到前者的计算方式可以是常规方法. 但计算后者时要注意无穷大和NaN的 ...
- 使用CLRMD编写一个自己的C#调试器
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:使用CLRMD编写一个自己的C#调试器.
- sqlserver 存储过程中拼接sql语句 动态执行
ALTER PROC [dbo].[Student_Friend_Get] @startRowIndexId INT, @maxNumberRows INT, @schoolId INT, @grad ...
- 显示、隐藏 PowerShell
以下是一个快速实现该需求的 module.只要将以下代码复制粘贴到 Documents\WindowsPowerShell\Packages\PowerShell\PowerShell.psm1 即可 ...
- JSP&Servlet学习手册
JSP&Servlet学习手册 沙琪玛 书 目录 JSP 指令... 3 书写方式... 3 指令列表... 3 JSP 内置对象... 3 内置对象特点... 3 常用内置对象... 3 o ...
- ibatis 开发中的经验 (一)ibatis 和hibernate 在开发中的理解
这个项目的底层是用ibatis框架完毕,这几天也是都在用这个框架写代码,也有了一些简单的理解,把项目拿过来后基本的配置都已经配置好了,比方一些事务.日志控制等,在开发中主要用到的是写SQL语句以及熟悉 ...
- 非常全面的java基础笔试题
下面是java基础笔试题,当时我去笔试,做了1个小时(80道选择题,后面的简答题就没时间做了),结果很吓人,太挫了,最后被面试官忽悠去培训去了,呵呵.我偷偷把面试题弄了下来,用来学习吧,也希望能对你们 ...