安卓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相关推荐

  1. Android Studio 下安卓 jni 开发错误 undefined reference to AndroidBitmap_getInfo

    博客: 安卓之家 微博: 追风917 CSDN: 蒋朋的家 简书: 追风917 又掉坑里了 今天开发 uvc,又遇到了坑: 和之前的这个坑类似:Android Studio 下安卓 jni 开发错误 ...

  2. 安卓 jni 开发错误 UnsatisfiedLinkError: Native method not found

    博客: 安卓之家 微博: 追风917 CSDN: 蒋朋的家 简书: 追风917 jni 开发的坑挺多的,今天遇到好多个,现在这个是这样的: UnsatisfiedLinkError: Native m ...

  3. 安卓 jni 开发错误 undefined reference to __android_log_print

    博客: 安卓之家 微博: 追风917 CSDN: 蒋朋的家 简书: 追风917 jni 最近要搞安卓下串口的读写,需要用到 jni,然后遇到了这个问题,坑挺多. 串口读写参考文章:Android串口操 ...

  4. 安卓 jni 开发 —— Android Studio 打包 so 的坑

    博客: 安卓之家 微博: 追风917 CSDN: 蒋朋的家 简书: 追风917 安卓开发坑无限 我心依旧,不变 向前 jni 开发的坑 这两天要搞安卓下的串口读写,这块涉及到了 jni 开发,我找了两 ...

  5. MAUI 框架安卓入门开发01 界面设计

    1.导航栏设计 1.1 由于需要水平布局的设计方式,所以外围需要使用一个HorizontalStackLayout 进行包裹着所有的子控件,来达到水平布局的效果.页面大概是这样子,按钮全部由Radio ...

  6. 安卓jni(ndk)开发实战(2)开发jni第一个HellowWorld程序

    一.前言 本文将创建一个 HelloWorld 程序,程序功能很简单,就是一个 jni 方法返回"HelloWorld "字符串,然后界面展示. jni 中涉及动态注册和静态注册, ...

  7. 鸿蒙so系统,鸿蒙手机版JNI实战(JNI开发、SO库生成、SO库使用)

    鸿蒙JNI开发现状 现阶段,不仅鸿蒙JNI相关的开发资料较少,而且Phone相关的JNI开发资料几乎没有,这对于新入行的鸿蒙开发者们来说,非常不友好. 也可能会给Android工程(使用了SO库的工程 ...

  8. java jni开发_Java JNI开发实践记录

    当使用到JNI的时候,基本可以肯定Java的平台移植性注定减弱,接下来记录一次使用Java JNI开发的经历. 关于Java JNI的相关资料参见: 下面是使用JNI常见三种场景: 1.在Java应用 ...

  9. JNI开发笔记(四)--实现一个简单的JNI工程并生成so库

    实现一个简单的JNI工程并生成so库 引 前言 1. 编写C/h文件并添加到工程 2. 修改CmakeLists.txt文件 3. 编写native-lib.cpp文件 4. 在MainActivit ...

最新文章

  1. 7.1Python异常处理
  2. Windows批处理命令学习
  3. Python爬取唐人街探案3豆瓣短评并生成词云
  4. linux 已有目录挂载磁盘
  5. ACR122U读写器真假判断
  6. 整理一些个人常用的windows软件
  7. xamp:在shell中运行mysql
  8. P1397 [NOI2013] 矩阵游戏(矩阵乘法欧拉定理)
  9. 杂谈eMule协议的由来
  10. linux防火墙设置命令,linux防火墙设置命令是什么
  11. 决策树、装袋、提升和随机森林的对比理解
  12. 相机中的光 —— 什么是F数,快门速度,感光度
  13. 2021互联网大厂职级对应薪资一览表
  14. 餐饮数据的分析与挖掘(1)——数据采集
  15. ES6将对象中同一类相加
  16. android手机信号测试,买手机别只看性能!教你测试手机信号好坏
  17. 初识单片机:51单片机简介
  18. Arduino与Proteus仿真实例-Nokia3310显示屏驱动仿真
  19. mysql join 三个表_Mysql JOIN(多个)表
  20. Windows 11 獲得新的多應用程序介面模式

热门文章

  1. CVPR 2019 Oral | 华科开源效果超群的人体姿态迁移算法
  2. 93%程序员都做过的事:来写一个python式的hello world吧
  3. 收藏 | PyTorch常用代码段合集
  4. C/C++根据特定字符分割字符串、读取文件去掉逗号等特定字符、strtok()函数详解
  5. 一文读懂经典卷积网络模型——LeNet-5模型(附代码详解、MNIST数据集)
  6. Could not find module ‘D:\codna\Library\bin\geos_c.dll‘
  7. 重学python入门知识
  8. 基于Tensorflow实现DeepFM
  9. Kaggle—So Easy!百行代码实现排名Top 5%的图像分类比赛
  10. 重复类发展手法_正确的护肤手法(动态演示),喜欢就拿去收藏吧!