• Android个人心得:超详细的JNI(NDK)入门与使用


    步骤0:环境搭建(参考Android-图像识别项目OpenCV(1):技术选型以及NDK搭建

    步骤1:创建一个Android应用。

     

    步骤2:写Java中需要用到的native函数。  

    public class JNI {
        public native int getCInt();
        public native String getCString();
    }  

    步骤3:保存并自动编译成.class文件。

     

    步骤4:打开cmd,将工作路径切换<Project>/bin/classes/。在编译时要加上包名,例子:javah -jni [包名].[类名]。

     

    步骤5:在工程目录下新建jni文件夹,把上面产生的.h文件拷贝过去,并以jni文件夹新建一个C++工程。

    注意:工程有时候找不到头文件时,需要手动添加。

    C:\cygwin\lib\gcc\i686-pc-cygwin\4.5.3\include\c++
    C:\cygwin\lib\gcc\i686-pc-cygwin\4.5.3\include\c++\i686-pc-cygwin
    C:\cygwin\lib\gcc\i686-pc-cygwin\4.5.3\include\c++\backward
    C:\cygwin\lib\gcc\i686-pc-cygwin\4.5.3\include
    C:\cygwin\lib\gcc\i686-pc-cygwin\4.5.3\include-fixed
    C:\cygwin\usr\include
    C:\cygwin\usr\include\w32api

    JNI的位置:${NDKROOT}/platforms/android-9/arch-arm/usr/include

    步骤6:编写c/c++文件:

    #include <stdio.h>
    #include <stdlib.h>
    
    #include "com_example_com_ndk_JNI.h"
    
    int add2()
    {
        int x,y;
        x=1000;
        y=8989;
        x+=y;
        return x;
    
    }
    
    /*
     * Class:     com_example_com_ndk_JNI
     * Method:    getCInt
     * Signature: ()I
     */
    JNIEXPORT jint JNICALL Java_com_example_com_ndk_JNI_getCInt
      (JNIEnv *env, jobject thiz)
    {
        return add2();
    }
    
    /*
     * Class:     com_example_com_ndk_JNI
     * Method:    getCString
     * Signature: ()Ljava/lang/String;
     */
    JNIEXPORT jstring JNICALL Java_com_example_com_ndk_JNI_getCString
      (JNIEnv *env, jobject thiz)
    {
        (*env)->NewStringUTF(env,"Hello NDK---->> ");
    }

    注意:编辑之后,函数为(JNIEnv *, jobject)只有参数类型没有参数变量,请改为(JNIEnv *env, jobject thiz)

     

    步骤7:编译之前要写2个.mk格式的文件。

    第一个.mk文件是Android.mk文件,这个文件放在jni目录下,内容为:

    LOCAL_PATH := $(call my-dir)

    include $(CLEAR_VARS)

    LOCAL_MODULE := HelloNDK
    LOCAL_SRC_FILES := com_example_com_ndk_JNI.c

    include $(BUILD_SHARED_LIBRARY)

    第一句话是写明c/c++文件的路径
    第二句话是清空
    第三句话是项目的名称
    第四句话是源文件的名称
    第五句话是指编辑成共享的库(.so)

    另一个是Application.mk,这个文件也放在jni目录下,内容为:

    APP_PROJECT_PATH := $(call my-dir)/..
    APP_MODULE := HelloNDK

    第一句是你的项目的路径。

     

    步骤8:打开Cygwin,进入到项目根目录,运行$NDK\ndk-build生成so库。

      生成的so库会自动保存在libs文件夹里。

    步骤9:编写Android程序,加载so库。方式为定义一个static块,载入库文件System.loadLibrary("库名")。

    import android.os.Bundle;
    import android.app.Activity;
    import android.widget.TextView;
    
    public class MainActivity extends Activity {
    
        static{
            System.loadLibrary("HelloNDK");
        }
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            JNI jni= new JNI();
            
            TextView textView=(TextView)findViewById(R.id.tvHello);
            textView.setText(jni.getCString()+Integer.toString(jni.getCInt()));
            
        }
    }

    步骤10:运行Android程序。  


    PS1:可以在Eclipse里面直接编译成so库而不用打开Cygwin

    步骤1:

    步骤2:进入工程属性页,build command设置为ndk下ndk-build的完整路径。

     

    PS2:

    如果你不需要使用NDK开发,只是需要使用第三方用NDK开发的库,那么你只需要这样做:把第三方提供的libxxx.so放到你的<project>/libs/armeabi/下, 然后在程序随便什么地方中加入
    static {
        System.loadLibray("xxx");
    }
    就可以使用该库了。

    一个人无梦想,同条咸鱼有咩分别?!
  • 相关阅读:
    Eclipse 中生成帮助文档 (javadoc) 迎客
    网管利器:七大免费网络工具 迎客
    oracle 11g 学习笔记 10_27
    oracle 11g 学习笔记 10_29
    oracle 11g学习笔记 2012_10_22
    oracle 11g 学习笔记 2012_10_25(2)
    oracle 11g 学习笔记 10_26
    oracle 11g 学习笔记 2012_10_24(1)
    oracle 11g 学习笔记2012_10_23(2)
    oracle 11g 学习笔记 2012_10_25(a)
  • 原文地址:https://www.cnblogs.com/TseChiHoi/p/2730843.html
Copyright © 2020-2023  润新知