• jni


    1、设置NDK

    local.properties

    ndk.dir=C:\Users\dong\AppData\Local\Android\Sdk\ndk-bundle
    sdk.dir=C:\Users\dong\AppData\Local\Android\Sdk

    2、创建JNI.java

    
    
    package com.example.dong.ndkdemo;
    public class JNI {
        {
            System.loadLibrary("hello");
        }
        // native 用于调用C对应的函数
        public  native String sayHello();
    }

     

    3、main下创建jni目录,创建文件Hello.c,Android.mk

    Hello.c

    #include <jni.h>
    //方法名必须为本地方法的全类名点改为下划线,穿入的两个参数必须这样写,
    //第一个参数为Java虚拟机的内存地址的二级指针,用于本地方法与java虚拟机在内存中交互
    //第二个参数为一个java对象,即是哪个对象调用了这个 c方法
    jstring Java_com_example_dong_ndkdemo_JNI_sayHello(JNIEnv* env,jobject obj){
        char* text="I from C";
        return (*env)->NewStringUTF(env,text);
    }

    Android.mk

        LOCAL_PATH := $(call my-dir)
        include $(CLEAR_VARS)
        #编译生成的文件的类库叫什么名字
        LOCAL_MODULE    := hello
        #要编译的c文件
        LOCAL_SRC_FILES := Hello.c
        include $(BUILD_SHARED_LIBRARY)

    4、设置app/bulid.gradle

    defaultConfig {
            ........
         ....... ndk{ moduleName "Hello"//so文件 app/build/intermediates/ndkBuild/debug/obj/local/{*}/libhello.so abiFilters "armeabi-v7a","arm64-v8a","x86","x86_64"//cpu类型arm、 mips "armeabi" } }
    externalNativeBuild {
    ndkBuild {
    path 'src/main/jni/Android.mk'
    }
    }

    5修改文件

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            String result=new JNI().sayHello();
            System.out.println("result=="+result);
        }
    }

    继续测试

    1、File------New Module ----名称javaCallC

    2、创建JNI.java

    public class JNI {
        public native int add(int a,int b);
        public native String sayHello(String s);
        public native int[] increateArrayEles(int[] intArray);
        public native int checkPwd(String pwd);
    }

    3、生成头文件

    在Terminal中进入切换至目录  javacallcsrcmainjni

    执行javah com.example.javacallc.JNI

    X:****javacallcsrcmainjava>javah com.example.javacallc.JNI     javah javac 不是内部或外部命令 解决方法 这是因为java10已经移除了javah的相关功能。

    为了使用java 10生成头文件,在windows的cmd命令行中使用以下命令:

    javacallcsrcmainjavacomexamplejavacallc>javac -h . JNI.java

    这样就会生成com_example_javacallc_JNI.h 文件,将文件移动到jni目录

    javah javac 不是内部或外部命令 解决方法

  • 相关阅读:
    spring相关记录
    xshell不能连接VM中的ubuntu
    MySQL 获得当前日期时间(以及时间的转换)
    struts2 action获取ajax提交数据中文乱码问题
    Write operations are not allowed in read-only mode (FlushMode.NEVER/
    在Action中以Struts2的方式输出JSON数据
    javascript 对象数组排序
    期待2015
    Mysql 导出数据库和指定表中的数据
    Ajax跨域问题
  • 原文地址:https://www.cnblogs.com/mingjing/p/9792240.html
Copyright © 2020-2023  润新知