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

  • 相关阅读:
    数据库字段太多,批量快速建立实体类方法(适合大量字段建立实体类)
    SQL service 中的 ”输入SQL命令窗口“ 打开了 “属性界面” 回到 ”输入SQL命令窗口“
    计算机软件编程英语词汇集锦
    编程常用英语词汇
    svn上传和下载项目
    当启动tomcat时出现tomcat setting should be set in tomcat preference page
    Implicit super constructor Object() is undefined for default constructor. Must define an explicit constructor
    eclipse中选中一个单词 其他相同的也被选中 怎么设置
    Spring Boot的@SpringBootApplication无法引入的问题
    最全的SpringCloud视频教程
  • 原文地址:https://www.cnblogs.com/zl1991/p/8870358.html
Copyright © 2011-2022 走看看