zoukankan      html  css  js  c++  java
  • android JNI调用(Android Studio 3.0.1)(转)

    最近回头复习了一下android 的jni调用,却发现按以前的方法调用失败,一怒之下就重新摸索,碰了几次壁,发现网上好多教程都不能成功调用,于是记录一下现在AS版本成功好用的调用方法。

    这里设定你的ndk已经下载并且设置没问题.源码链接:http://download.csdn.net/download/yeyuehei/10149844

    当前android studio 版本3.0.1,步骤如下:

    1.设置jni -h 和ndk -build的快捷方式

    2.java代码写c回调的方法,及grade的配置

    3.快捷键jni -h生成头文件.h

    4.建立c资源文件和mk文件及c函数的调用

    5.快捷键ndk-build生成三种.so库文件

    以上是步骤,具体如下:

    1.置jni -h 和ndk -build的快捷方式

    新建项目,成功后点击File,然后找到Settings...点击找到External Tools,然后如下图添加java -jni快捷键

    Tool settings中三行可以直接copy上去:
    $JDKPath$injavah.exe
    -classpath . -jni -d $ModuleFileDir$/src/main/jni $FileClass$
    $ModuleFileDir$srcmainjava

    添加ndk-build快捷键如下图:

    Tool settings 的两行:

    F:softwareandroidstudiosdk dk-bundle dk-build.cmd(根据自己的ndk目录设置这个路径)

    $ModuleFileDir$srcmain(直接copy)

    添加成功后随便右键点击一个文件找到External Tools就会发现刚才添加的快捷键

    2.java代码写c回调的方法,及grade的配置

    新建一个class 名称随便,这里是JniKet,如下

    打开build.gradle 添加ndk和 sourceSets如下图

    注意:

    1.ndk中的moduleName要和上图中的libName一致

    2.sourceSets中的两行都要加上缺一不可

    3.图中红框的代码会在图下面出现。。。

    ndk {
        moduleName "JniDemo"
        abiFilters "armeabi", "armeabi-v7a", "x86"//cpu的类型
    }
    
    sourceSets {
        main {
            jniLibs.srcDirs  'src/main/libs
            jni.srcDirs = []
        }
    }

    以上配置就够了,其他都不需要

    3.快捷键jni -h生成头文件.h,建立c资源文件和mk文件及c函数的调用

    选中刚才建的class(这里是JniKet),右键找到External Tools,选中jni -h,然后会在main下成jni文件夹,里面包含生成的头文件,名称格式:包名+类名.h

    打开.h文件如下图:

    右键->new->c/c++ source file->type选.c(名称随便,这里是TestJni),然后copy上图红框中的两个函数到新建的.c文件

    为了验证 能调用c方法,再建立一个c方法的头文件和资源文件(同一个文件夹下):

    test.h:

    #include <string.h>
    
    #include <jni.h>
    
    int addValue(int x, int y);

    test.c

    #include "test.h"
    int addValue(int x, int y){
    
    return x*10+y*10;
    }
    

    最后将test.c引入刚才建立的jni资源文件中(这里是TestJni))最后TestJni如下:

    #include  "lifaair_edifier_com_myjni_JniKet.h"
    #include "test.c"
    
    JNIEXPORT jstring JNICALL Java_lifaair_edifier_com_myjni_JniKet_testJni
      (JNIEnv *env, jclass jc){
    
         return (*env)->NewStringUTF(env,"fuck your father,langfei laozi's time");
      }
    JNIEXPORT jint JNICALL Java_lifaair_edifier_com_myjni_JniKet_getValue
        (JNIEnv *env, jclass js ){
    
    
        return addValue(10, 8);
      }

    当然别忘了mk文件两个:

    名称:Android.mk

    内容:

    LOCAL_PATH := $(call my-dir)  
    include $(CLEAR_VARS)  
      
    LOCAL_MODULE := JniDemo
    LOCAL_C_INCLUDES := lifaair_edifier_com_myjni_JniKet.h
    LOCAL_SRC_FILES := TestJni.c
      
    LOCAL_LDLIBS := -llog  
      
    include $(BUILD_SHARED_LIBRARY)

    名称:Application.mk

    内容:

    APP_ABI := armeabi armeabi-v7a x86

    5.快捷键ndk-build生成三种.so库文件

    右键点击Jniket(步骤2中生成的 java class),右键找到External Tools,选中ndk-build,就会生成三种.so文件如下图:

    当然还有最重要的调用:

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            TextView tv_hello = findViewById(R.id.tv_hello);
            tv_hello.setText("this message from jni,its value is:
    "+JniKet.testJni()+"
     getValue():"+JniKet.getValue()); 
    
        }
    
    }

    编译运行,成功运行如下图:

    转自:https://blog.csdn.net/yeyuehei/article/details/78741753

  • 相关阅读:
    JS 对象定义
    JavaScript HTML DOM 元素(节点)
    DOM 事件
    DOM CSS
    DOM HTML
    DOM 简介
    JS 验证
    JS 错误
    JavaScript Break 和 Continue 语句
    JS While
  • 原文地址:https://www.cnblogs.com/zl1991/p/8870358.html
Copyright © 2011-2022 走看看