安卓JNI开发-01
安卓JNI开发
java中调用C,并传入相应数据进行模拟处理后再返回到java中
package com.example.jnitest;import java.util.Arrays;import android.R.integer;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;public class HomeActivity extends Activity {static{System.loadLibrary("jniT");}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_home);}//点击从C中返回一个字符串 public void return_String_c(View view ){String returnString = returnStringC();Toast.makeText(getApplicationContext(), returnString, 0).show();}//向C中传入一个INT,进行处理后再返回 到java中去public void inputIntNumber(View view){int returnInt = inputIntNumbers(9);Toast.makeText(getApplicationContext(), returnInt+"", 0).show();}//向C中传入一个String ,进行处理后再返回 到java中去 public void inputStringNumber(View view){String returnString = addStringReturn("llo");Toast.makeText(getApplicationContext(), returnString, 0).show();}//向C中传入一个int数组,进行处理后,再返回 到java中public void inputIntsNumber(View view){int[] arr = {1,2,3};int[] returnInts = addIntsReturn(arr);Toast.makeText(getApplicationContext(), arr.toString(), 0).show();}//从C中返回一个Stringprivate native String returnStringC();//向C中传入一个String ,进行处理后再返回 到java中去 private native String addStringReturn(String s);//向C中传入一个int数组,进行处理后,再返回 到java中private native int[] addIntsReturn(int[] is);//向C中传入一个INT,进行处理后再返回 到java中去private native int inputIntNumbers(int ii);}
#include <jni.h>
#include <stdlib.h>
//#include ""
//#开始的是C 中的预编译
//在C++中 JNIEnv是一个结构体 env是一级指针 ,在调用函数的时候直接 调用
//c++函数要先声明,再调用
#include <android/log.h>
#include <stdlib.h>
#define LOG_TAG "CLOG"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)//进行C 与 Java 中的String 的转换
char* Jstring2CStr(JNIEnv* env, jstring jstr)
{char* rtn = NULL;jclass clsstring = (*env)->FindClass(env,"java/lang/String");jstring strencode = (*env)->NewStringUTF(env,"GB2312");jmethodID mid = (*env)->GetMethodID(env,clsstring, "getBytes", "(Ljava/lang/String;)[B");jbyteArray barr= (jbyteArray)(*env)->CallObjectMethod(env,jstr,mid,strencode); // String .getByte("GB2312");jsize alen = (*env)->GetArrayLength(env,barr);jbyte* ba = (*env)->GetByteArrayElements(env,barr,JNI_FALSE);if(alen > 0){rtn = (char*)malloc(alen+1); //"\0"memcpy(rtn,ba,alen);rtn[alen]=0;}(*env)->ReleaseByteArrayElements(env,barr,ba,0); //return rtn;
}//向java中返回 一个 String
JNIEXPORT jstring JNICALL Java_com_example_jnitest_HomeActivity_returnStringC
(JNIEnv * env, jobject obj ){return (*env)->NewStringUTF(env,"holleod");}/** Class: com_example_jnitest_HomeActivity* Method: addStringReturn* Signature: (Ljava/lang/String;)Ljava/lang/String;*/
//接收一个String 进行处理后返回 到java中的String
JNIEXPORT jstring JNICALL Java_com_example_jnitest_HomeActivity_addStringReturn
(JNIEnv * env, jobject obj , jstring jst){char* inputString = Jstring2CStr(env,jst);char* newString = "addNewString";//装饰两个字符串连接到一起strcat(inputString,newString);return (*env)->NewStringUTF(env,inputString);}/** Class: com_example_jnitest_HomeActivity* Method: addIntsReturn* Signature: ([I)[I*/
//接收一个 int数组 进行处理后再返回 到java中去
JNIEXPORT jintArray JNICALL Java_com_example_jnitest_HomeActivity_addIntsReturn
(JNIEnv * env , jobject obj , jintArray jarr){//获取数组 的长度jint length = (*env)->GetArrayLength(env,jarr);//遍历数组 对每一个元素进行操作int* elements = (*env)->GetIntArrayElements(env,jarr,0);int i = 0;for (i = 0; i < length; i++) {*(elements+i)+=10;}
//return jarr;
}
接收java传过来的一个int数值 进行处理后再返回到java中
JNIEXPORT jint JNICALL Java_com_example_jnitest_HomeActivity_inputIntNumbers
(JNIEnv * env, jobject obj , jint ji){return ji+=101010;
}
对应的Android.mk文件
LOCAL_PATH := $(call my-dir)# LOCAL_PATH CX返回当前工程目录
# 清空之前所有的缓存
include $(CLEAR_VARS)
# 打包生成涵数库的名字 自动在前面生成lib 在后面生成 .so 如果前面加lib 生成涵数库的名字就 不自动加 lib 了
LOCAL_MODULE := jniT
# 把哪些 c 文件打包生成函数库
LOCAL_SRC_FILES := jniT.c
# BUILD_SHARED_LIBRARY 生成动态涵数库 .so 体积小 把用到的系统中的函数动态加载 随着使用用而加载
# BUILD_STATIC_LIBRARY 生成静态函数库 .a 体积大 把用到的函数一冷次性全部加载进来
LOCAL_LDLIBS += -lloginclude $(BUILD_SHARED_LIBRARY)
对应的Application.mk文件
APP_ABI := x86 armeabi
# 去掉警告
APP_PLATFORM := android-8
界面布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context=".HomeActivity" ><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="return_String_c"android:text="从C中返回字符串" /><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="inputIntNumber"android:text="传入一个int加1后返回" /><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="inputStringNumber"android:text="传入一个String返回" /><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="inputIntsNumber"android:text="传入一个int数组后返回" /></LinearLayout>
安卓JNI开发-01相关推荐
- Android Studio 下安卓 jni 开发错误 undefined reference to AndroidBitmap_getInfo
博客: 安卓之家 微博: 追风917 CSDN: 蒋朋的家 简书: 追风917 又掉坑里了 今天开发 uvc,又遇到了坑: 和之前的这个坑类似:Android Studio 下安卓 jni 开发错误 ...
- 安卓 jni 开发错误 UnsatisfiedLinkError: Native method not found
博客: 安卓之家 微博: 追风917 CSDN: 蒋朋的家 简书: 追风917 jni 开发的坑挺多的,今天遇到好多个,现在这个是这样的: UnsatisfiedLinkError: Native m ...
- 安卓 jni 开发错误 undefined reference to __android_log_print
博客: 安卓之家 微博: 追风917 CSDN: 蒋朋的家 简书: 追风917 jni 最近要搞安卓下串口的读写,需要用到 jni,然后遇到了这个问题,坑挺多. 串口读写参考文章:Android串口操 ...
- 安卓 jni 开发 —— Android Studio 打包 so 的坑
博客: 安卓之家 微博: 追风917 CSDN: 蒋朋的家 简书: 追风917 安卓开发坑无限 我心依旧,不变 向前 jni 开发的坑 这两天要搞安卓下的串口读写,这块涉及到了 jni 开发,我找了两 ...
- MAUI 框架安卓入门开发01 界面设计
1.导航栏设计 1.1 由于需要水平布局的设计方式,所以外围需要使用一个HorizontalStackLayout 进行包裹着所有的子控件,来达到水平布局的效果.页面大概是这样子,按钮全部由Radio ...
- 安卓jni(ndk)开发实战(2)开发jni第一个HellowWorld程序
一.前言 本文将创建一个 HelloWorld 程序,程序功能很简单,就是一个 jni 方法返回"HelloWorld "字符串,然后界面展示. jni 中涉及动态注册和静态注册, ...
- 鸿蒙so系统,鸿蒙手机版JNI实战(JNI开发、SO库生成、SO库使用)
鸿蒙JNI开发现状 现阶段,不仅鸿蒙JNI相关的开发资料较少,而且Phone相关的JNI开发资料几乎没有,这对于新入行的鸿蒙开发者们来说,非常不友好. 也可能会给Android工程(使用了SO库的工程 ...
- java jni开发_Java JNI开发实践记录
当使用到JNI的时候,基本可以肯定Java的平台移植性注定减弱,接下来记录一次使用Java JNI开发的经历. 关于Java JNI的相关资料参见: 下面是使用JNI常见三种场景: 1.在Java应用 ...
- JNI开发笔记(四)--实现一个简单的JNI工程并生成so库
实现一个简单的JNI工程并生成so库 引 前言 1. 编写C/h文件并添加到工程 2. 修改CmakeLists.txt文件 3. 编写native-lib.cpp文件 4. 在MainActivit ...
最新文章
- 7.1Python异常处理
- Windows批处理命令学习
- Python爬取唐人街探案3豆瓣短评并生成词云
- linux 已有目录挂载磁盘
- ACR122U读写器真假判断
- 整理一些个人常用的windows软件
- xamp:在shell中运行mysql
- P1397 [NOI2013] 矩阵游戏(矩阵乘法欧拉定理)
- 杂谈eMule协议的由来
- linux防火墙设置命令,linux防火墙设置命令是什么
- 决策树、装袋、提升和随机森林的对比理解
- 相机中的光 —— 什么是F数,快门速度,感光度
- 2021互联网大厂职级对应薪资一览表
- 餐饮数据的分析与挖掘(1)——数据采集
- ES6将对象中同一类相加
- android手机信号测试,买手机别只看性能!教你测试手机信号好坏
- 初识单片机:51单片机简介
- Arduino与Proteus仿真实例-Nokia3310显示屏驱动仿真
- mysql join 三个表_Mysql JOIN(多个)表
- Windows 11 獲得新的多應用程序介面模式
热门文章
- CVPR 2019 Oral | 华科开源效果超群的人体姿态迁移算法
- 93%程序员都做过的事:来写一个python式的hello world吧
- 收藏 | PyTorch常用代码段合集
- C/C++根据特定字符分割字符串、读取文件去掉逗号等特定字符、strtok()函数详解
- 一文读懂经典卷积网络模型——LeNet-5模型(附代码详解、MNIST数据集)
- Could not find module ‘D:\codna\Library\bin\geos_c.dll‘
- 重学python入门知识
- 基于Tensorflow实现DeepFM
- Kaggle—So Easy!百行代码实现排名Top 5%的图像分类比赛
- 重复类发展手法_正确的护肤手法(动态演示),喜欢就拿去收藏吧!