zoukankan      html  css  js  c++  java
  • android 调用jni

    (用jni,jna速度差百倍)

    1 、 android 里 Hello.java

    package com.example.administrator.t1;
    
    public class Hello {
        static {
            System.loadLibrary("sayhello");
        }
        public native void say();
        public native String getStringFromJNI();
    }

    2、用javah生成头文件 到classes目录下

    E:andprogramandproplayerJnitestRgbappuildintermediatesjavacdebugclasses>set classpath=E:/andprogram/program/newsdk/platforms/android-30/android.jar;.
    后面的;.重要 ,不然把以前的覆盖了
    E:andprogramandproplayerJnitestRgbappuildintermediatesjavacdebugclasses>javah  com.example.administrator.t1.Hello

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class com_example_administrator_t1_Hello */
     
    #ifndef _Included_com_example_administrator_t1_Hello
    #define _Included_com_example_administrator_t1_Hello
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     com_example_administrator_t1_Hello
     * Method:    say
     * Signature: ()V
     */
    JNIEXPORT void JNICALL Java_com_example_administrator_t1_Hello_say
      (JNIEnv *, jobject);
     
    /*
     * Class:     com_example_administrator_t1_Hello
     * Method:    getStringFromJNI
     * Signature: ()Ljava/lang/String;
     */
    JNIEXPORT jstring JNICALL Java_com_example_administrator_t1_Hello_getStringFromJNI
      (JNIEnv *, jobject);
     
    #ifdef __cplusplus
    }
    #endif
    #endif

    3、下载ndk ,在ubuntu解压

    vim /etc/profile,添加

    export ANDROID_NDK=/home/wang/program/android-ndk-r21d
    export PATH=$ANDROID_NDK:$PATH

    source

    ndk-build -v

    安装好了

    4、ubuntu上建立jnitest1目录

    Application.mk

    jni //目录

        Android.mk

        test.c

    test.c

    #include <stdio.h>
    #include <jni.h>
    JNIEXPORT void JNICALL Java_com_example_administrator_t1_Hello_say
      (JNIEnv * env, jobject obj){
      //  LOGI("Hello World~~~");
        return;
    }
    
    JNIEXPORT jstring JNICALL Java_com_example_administrator_t1_Hello_getStringFromJNI
      (JNIEnv * env, jobject obj){
        //LOGI("here will return a String 'Hello World'");
        jstring newstring = (*env)->NewStringUTF(env,"Hello World");
        const char* str= (*env)->GetStringUTFChars(env, newstring ,NULL);//使用
    GetStringUTFChars方法将"Hello World"转成UTF-8格式的string的对象str
        (*env)->ReleaseStringUTFChars(env, newstring, str);//释放str对象的空间>,如果不显示的调用的话,JVM中会一直保存该对象,不会被垃圾回收器回收,因此就
    会导致内存溢出
        return newstring;
    }

    Android.mk

    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    #LOCAL_MODULE表示生成的动态库名为sayhello
    LOCAL_MODULE := sayhello
    #LOCAL_SRC_FILES表示使用到的类
    LOCAL_SRC_FILES := test.c
    #LOCAL_SRC_FILES := sayhello.cpp
    LOCAL_LDLIBS := -lm -llog -ljnigraphics
    
    include $(BUILD_SHARED_LIBRARY)

    Application.mk

    # Uncomment this if you're using STL in your project
    # See CPLUSPLUS-SUPPORT.html in the NDK documentation for more information
    # APP_STL := stlport_static
    #APP_BUILD_SCRIPT :=  Android.mk
    #APP_ABI := armeabi-v7a arm64-v8a x86 x86_64
    
    APP_ABI := all
    # Min runtime API level
    APP_PLATFORM=android-16

    ndk-build 生成 libs,拷贝到android studio工程目录下

    5、

    、build.gradle(Module:app)里在buildTypes  后面添加 sourceSets 部分

        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            }
        }
        sourceSets {
            main {
                jniLibs.srcDirs = ['libs']
            }
        }

    6、android studio调用

      new Hello().getStringFromJNI()

    注意test.c里函数名要和包路径对应

  • 相关阅读:
    完整的开源和商业软件平台
    免费开源的文件比较/合并工具
    Javascript面向对象基础
    Javascript面向对象基础
    引入外部js获取dom为null的问题
    闭包函数
    初识对象
    构造函数
    内置对象
    Math对象
  • 原文地址:https://www.cnblogs.com/cnchengv/p/14409752.html
Copyright © 2011-2022 走看看