• Ubuntu下NDK环境搭建以及使用


    1.下载并解压ndk到任意目录。

    2.根据ndk解压目录配置环境变量。

    在终端输入vim .hashrc,在最后配置如下:

     

    然后“Esc”退出编辑状态,“Shift + :”使终端接受编译器命令,“wp”保存,“q!”或“Ctrl + Z”退回到终端界面,环境变量添加完成。这里注意要重启终端后才会生效。

    3.在终端输入ndk-build,如显示如下则环境搭建成功。

    4.使用时,先创建java代码,如下:

    public class JnitestMainActivity extends Activity {
           private EditText edittext;
           private TextView textview;
           private Button btn;    
        
           private native int myFun(int n);
           static {
                   System.loadLibrary("jnitest");
           }
    
           @Override
           protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_jnitest_main);
            
        edittext = (EditText)findViewById(R.id.edit_text);
        textview =(TextView)findViewById(R.id.text_view);
        btn = (Button)findViewById(R.id.button);
        btn.setOnClickListener(new OnClickListener() {
                
        @Override
        public void onClick(View v) {
        // TODO Auto-generated method stub
        String content = edittext.getText().toString();
        int n;
        if(!content.equals("")){
                n = Integer.valueOf(content);//ok
                textview.setText(content + "!" + "=" +myFun(n));
                }
         }
            });
    }

    然后编译该工程使产生 JnitestMainActivity.class文件,供下一步产生.h文件使用。

    5.产生头文件,先在工程中创建jni文件夹,在终端进入工程目录,输入javah -classpath bin/classes -d jni com.test.jnitest.JnitestMainActivity

    ,具体意义可以用javah –help指令察看,需要说明的是-classpath对应的参数应该为com文件夹所在目录,有的可能是bin。

    生成的头文件为:com_test_jnitest_JnitestMainActivity.h

    内容是:

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class com_test_jnitest_JnitestMainActivity */
    
    #ifndef _Included_com_test_jnitest_JnitestMainActivity
    #define _Included_com_test_jnitest_JnitestMainActivity
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     com_test_jnitest_JnitestMainActivity
     * Method:    myFun
     * Signature: (I)I
     */
    JNIEXPORT jint JNICALL Java_com_test_jnitest_JnitestMainActivity_myFun(
            JNIEnv *, jobject, jint);
    
    #ifdef __cplusplus
    }
    #endif
    #endif

    JNIEnv*, jobject是所有jni函数必有的两个参数,分别表示jni环境和对应的java类(或对象)本身

    6.编写相应的.c文件,先把上面的函数拷过来,删掉JNIEXPORT和 JNICALL,具体如下:

    #include <jni.h>
    #include <string.h>
    
    jint factorial(jint n) {
        if (n == 1) {
            return 1;
        }
        return factorial(n - 1) * n;
    }
    
    jint Java_com_test_jnitest_JnitestMainActivity_myFun(JNIEnv * env,
            jobject this, jint n) {
        return factorial(n);//求阶乘
    }

    完成.c文件后com_test_jnitest_JnitestMainActivity.h就没用了,可删除。

    7.编写Android.mk文件,具体如下:

    LOCAL_PATH := $(call my-dir)//必须有

    include $(CLEAR_VARS)//清除LOCAL开头的变量

    LOCAL_MODULE := jnitest//要生成的库文件

    LOCAL_SRC_FILES := jnitest.c//需要编译的C源文件

    include $(BUILD_SHARED_LIBRARY)//编译成一个共享库

    该脚本还有其他宏,感兴趣可以研究下。

    8.编译生成.so共享库文件,进入工程目录,输入ndk-build命令,就会在libs/armeabi目录下生成libjnitest.so,重新编译工程,libjnitest.so共享库会一起打包在apk文件内。

  • 相关阅读:
    【知识强化】第四章 网络层 4.1 网络层的功能
    【知识强化】第三章 数据链路层 3.8 数据链路层设备
    【知识强化】第三章 数据链路层 3.7 广域网
    【知识强化】第三章 数据链路层 3.6 局域网
    【知识强化】第三章 数据链路层 3.5 介质访问控制
    【知识强化】第三章 数据链路层 3.4 流量控制与可靠传输机制
    ASP.NET MVC入门之再不学习就真的out了
    ASP.NET MVC系列:添加模型的验证规则
    ASP.NET MVC系列:为已有模型添加新的属性
    ASP.NET MVC系列:为视图添加查询功能
  • 原文地址:https://www.cnblogs.com/kingOfPointer/p/3578638.html
Copyright © 2020-2023  润新知