Jni API:https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/jniTOC.html
JNIEnv、jobject和jclass这三种基本类型

操作API都在JNIEnv中,JNIEnv为Java与C/C++通信桥梁
jobject:Java层传递的对象(普通native方法传递)
jclass:Java层对应的Class类(静态native方法传递)

native普通方法与静态方法区别:Jni传递参数是jobject和jclass区别

android studio ndk api自动补齐
安装插件:
Android NDK Support
NDK WorkspaceManager Support

属性,方法,数组例子:
Java层
public class MainActivity extends AppCompatActivity {

private static final String TAG = "MainActivity";
//测试属性
public String strName ="test";//排序数组
private int[] array = {89,2,4,34,88,100,1};
// Used to load the 'native-lib' library on application startup.
static {System.loadLibrary("native-lib");
}@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// Example of a call to a native methodTextView tv = (TextView) findViewById(R.id.sample_text);//测试属性操作tv.setText(updateStringFromC());//测试方法调用tv.setText(getJavaMethod());//测试数组操作this.operateArraySort(array);for (int i = 0; i < array.length; i++){Log.e(TAG, "onCreate: " + array[i]);}//异常处理 C++的异常 JAVA是无法try catch的,如果jni层出现了异常,那么Java的代码调用中止try {exception();}catch (Exception e){Log.e(TAG, "onCreate: " + e.getMessage());}Log.e(TAG, "onCreate: " + "end");}
//测试方法
public String getMethod(int a){return "method" + a;
}/*** A native method that is implemented by the 'native-lib' native library,* which is packaged with this application.*/
public native String stringFromJNI();
//从C返回字符串
public native String updateStringFromC();
//调用Java方法
public native String getJavaMethod();
//对array数组进行排序操作
public native void operateArraySort(int[] array);
//异常处理
public native void exception();

}

Jni层:

#include <jni.h>
#include <string>
#include "stdlib.h"//C C++混编int compare(const void* lhs, const void* rhs){return (*(int*)lhs - *(int*)rhs);
}//异常处理
extern "C"
JNIEXPORT void JNICALL
Java_com_home_adproj_androidndktest_MainActivity_exception(JNIEnv *env, jobject instance) {jclass  _jclass = env->GetObjectClass(instance);jfieldID _jfieldID = env->GetFieldID(_jclass,"strName2","Ljava/lang/String;");//strName2不存在有异常if(env->ExceptionCheck()){//检测异常env->ExceptionClear();//清除异常 不会使Java层崩溃//抛异常给Java层jclass exceptionClass = env->FindClass("java/lang/IllegalArgumentException");env->ThrowNew(exceptionClass,"strName2 不存在");//抛异常到Java层,Java层进行捕获}
}//对Java数组进行操作
extern "C"
JNIEXPORT void JNICALL
Java_com_home_adproj_androidndktest_MainActivity_operateArraySort(JNIEnv *env, jobject instance,jintArray array_) {jint *arrays = env->GetIntArrayElements(array_, NULL);int _len = env->GetArrayLength(array_);//获取数组长度//qsort(void* __base, size_t __nmemb, size_t __size, int (*__comparator)(const void* __lhs, const void* __rhs));qsort(arrays,_len, sizeof(int),compare);//数组排序env->ReleaseIntArrayElements(array_, arrays, 0);//释放
}//调用Java层方法
extern "C"
JNIEXPORT jstring JNICALL
Java_com_home_adproj_androidndktest_MainActivity_getJavaMethod(JNIEnv *env, jobject instance) {jclass _jclass =env->GetObjectClass(instance);//(jclass clazz, const char* name, const char* sig)jmethodID _jmethodID = env->GetMethodID(_jclass,"getMethod","(I)Ljava/lang/String;");//(参数类型)Ljava/lang/String返回值类型jstring result = (jstring) env->CallObjectMethod(instance, _jmethodID,100);char* str = (char *) env->GetStringUTFChars(result, NULL);//string 转charreturn env->NewStringUTF(str);
}//测试Java属性操作
extern "C"
JNIEXPORT jstring JNICALL
Java_com_home_adproj_androidndktest_MainActivity_updateStringFromC(JNIEnv *env, jobject instance) {// TODOjclass _jclass = env->GetObjectClass(instance);//(jclass clazz, const char* name, const char* sig)//name:属性名  sig:属性类型jfieldID _jfieldID = env->GetFieldID(_jclass,"strName","Ljava/lang/String;");jstring _result = (jstring) env->GetObjectField(instance, _jfieldID);//如何转化成java stringchar* str = (char *) env->GetStringUTFChars(_result, NULL);char text[20] = "success";return env->NewStringUTF(strcat(str,text));
}extern "C"
JNIEXPORT jstring JNICALL
Java_com_home_adproj_androidndktest_MainActivity_stringFromJNI(JNIEnv* env,jobject /* this */) {std::string hello = "Hello from C++";return env->NewStringUTF(hello.c_str());
}

lldb:jni调试工具
官网:http://lldb.llvm.org/tutorial.html

转载于:https://blog.51cto.com/xuguohongai/2156670

android jni介绍相关推荐

  1. Android JNI开发入门之一

    JNI在Android系统中有着广泛的应用.Android系统底层都是C/C++实现的,上层提供的API都是Java的,Java通过JNI调用底 层的实现.比如:Android API多媒体接口Med ...

  2. Android JNI原理分析

    引言:分析Android源码6.0的过程,一定离不开Java与C/C++代码直接的来回跳转,那么就很有必要掌握JNI,这是链接Java层和Native层的桥梁,本文涉及相关源码: frameworks ...

  3. android jni malloc和free的使用

    今天,简单讲讲android在jni如何使用malloc和free进行内存的分配和释放. 这个其实也是C++相关的知识,不过jni需要用到,所以这里记录一下. 一.malloc()和free()的基本 ...

  4. android jni new/delete 和 new[]/delete[]

    今天,简单讲讲android里再jni使用new时如何释放内存. 这个其实是和C++有关的知识,不过jni编程时还是需要注意的.所以这里记录一下. new 和 delete 到底是什么? 如果找工作的 ...

  5. android jni ——Field Method -- Accessing Field

    现在我们知道了怎样使用native code访问简单的数据类型和引用参考类型(string,array),下面我们来介绍怎样让jni代码去访问java中的成员变量和成员函数,然后可以再jni中回调ja ...

  6. 【分享】Android JNI实例​

    [分享]Android JNI实例​ Android的SDK中没有包括JNI的支持,而且对如何支持JNI也没有任何文档说明.不过既然整个Android平台是开源的,我们可以通过Google发布的源代码 ...

  7. android JNI(转)

    原文:http://jinguo.iteye.com/blog/696185 Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行 ...

  8. Android JNI开发入门之二

    在上一篇文章<Android JNI开发入门之一>中,我介绍了Android应用程序(APK)怎样通过JNI调用Native C实现的共享库.本文将进一步介绍Android应用程序通过JN ...

  9. Android JNI学习(六)——Java与Native实战演习

    前言: 前几篇我主要介绍了jni先关的基础知识和常用API,相信看过的童靴对JNI已经有了一定的了解,如果不了解也没关系,下面我给出了链接,可以点进去学习.接下来我将实战一个完整案例,案例很简单,就是 ...

  10. Android JNI学习(五)——Java与Native之间如何实现相互调用

    本章将讲述Java与Native之间如何实现相互调用.我将围绕围绕如下三点来讲解. #mermaid-svg-qeVnGlVrLWrB5ryX .label{font-family:'trebuche ...

最新文章

  1. 怎样用python自动化办公_会python基础,如何学习自动化办公?
  2. 模拟http中需要注意到的headers字段
  3. 基础-简单的深度优先遍历
  4. python辅助脚本教程_微信跳一跳python辅助脚本实例分享
  5. 软件项目管理大作业_《软件工程》软件项目管理实验
  6. 如何方便手机在线抖音去水印更有热门技巧
  7. mmd 到 blender 到 ue4/ue5 缩放比例相关的处理流程
  8. Banner设计技巧总结
  9. 求义隆单片机c语言红外解码程序,吐槽义隆单片机,顺便送上超轻红外解码程序....
  10. android仿微信点击好友,安卓开发仿微信联系人列表-机器人列表视图仿微通道聊天多久最底部滑动...
  11. MAC下微信双开(一键命令)
  12. iOS端如何实现带UI截屏分享
  13. m计算机基本拓扑结构,计算机网络的拓扑结构
  14. 平台业务收款分账产品设计 - 支付计费分账
  15. L1 distace、L2 distance,L1 norm、L2 norm,L1、L2范数
  16. PromSql的写法详解
  17. 计算机体系架构(5)总线与 IO 接口
  18. Spring--BeanPostProcessor--注意/问题/坑--SpringBoot
  19. 终于将一头骡子搞定了
  20. 计算机中表示信息量最小的单位是什么,计算机中信息的最小单位是什么?

热门文章

  1. cad插入块_CAD施工制图常见问答(一)
  2. Android app接入微信人脸支付详解
  3. 几个常用的C语言编程工具,极力推荐!
  4. java是什么类型语言_java属于什么类型语言
  5. PDF文件如何转JPG图片?简单三步轻松转换
  6. HTML基础学习(菜鸟教程和W3school参考手册)
  7. 毕业论文格式系列1 Word 图片交叉引用其题注
  8. 用HTML来做导航栏
  9. html怎么快捷复制粘贴,如何使用快捷键复制粘贴
  10. (伪)点到线段的距离 C++