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");}@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    // Example of a call to a native method    TextView 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 #include #include "stdlib.h"//C C++混编int compare(const void* lhs, const void* rhs){    return (*(int*)lhs - *(int*)rhs);}//异常处理extern "C"JNIEXPORT void JNICALLJava_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 JNICALLJava_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 JNICALLJava_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 转char    return env->NewStringUTF(str);}//测试Java属性操作extern "C"JNIEXPORT jstring JNICALLJava_com_home_adproj_androidndktest_MainActivity_updateStringFromC(JNIEnv *env, jobject instance) {    // TODO    jclass _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 string    char* str = (char *) env->GetStringUTFChars(_result, NULL);    char text[20] = "success";    return env->NewStringUTF(strcat(str,text));}extern "C"JNIEXPORT jstring JNICALLJava_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

更多相关文章

  1. Android(安卓)file.createNewFile方法问题总结
  2. 有关Android中EditText的一些属性
  3. android中获得屏幕、视图、任务栏、状态栏的高宽以及屏幕的设置
  4. Android(安卓)onSaveInstanceState和onRestoreInstanceState的用
  5. Android(安卓)context源码详解及深入分析
  6. Android的两种数据存储方式分析(一)
  7. 浅谈Java中Collections.sort对List排序的两种方法
  8. 箭头函数的基础使用
  9. Python list sort方法的具体使用

随机推荐

  1. 25、Android中通过Intent传递对象、集合
  2. android ListView Item和CheckBox、Butto
  3. Android数据持久化之SQLite数据库用法分
  4. (转)Android(安卓)AndroidManifest.xml文件
  5. 我来说说Android(安卓)touch 系统的设计
  6. Android学习第一天--Activity生命周期
  7. Android——自定义View类(一 )
  8. Android(安卓)-- 内存泄漏
  9. 用Dbus与android的bluz通信
  10. 关于Android的问号?和@符号的用法