zoukankan      html  css  js  c++  java
  • JNI+NDK编程总结

    软件版本的选择:
    1、ADT-Bundle:adt-bundle-windows-x86_64-20131030
    理由:这个版本自带Native Developer Tools支持,是否支持看Preferences,有NDK项就是支持了。可以安装插件,这里略过,选择集成了最简单。
     JNI+NDK编程总结

    adt-bundle-windows-x86_64-20140702这个版本不支持
    2、NDK版本:android-ndk-r10e-windows-x86.exe
    这个还不是64位的,应该没有问题

    3、创建工程testNDK,因此包名写成了cn.maxma.testndk,都是小写的
    里面就一个类MainActivity,派生自Activity。

    4、主要代码如下:

    public class MainActivity extends Activity {

       

        private TextView tv;

        private Button btn;

     

        @Override

        protected void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);

            setContentView(R.layout.activity_main);

            //

            tv = (TextView) findViewById(R.id.textView1);

            btn = (Button) findViewById(R.id.button1);

           

        }

             // android:onClick="clickMe"

    public void clickMe(View view){

            double randowmDouble= Math.random();

           long x=Math.round(randowmDouble*100);

            randowmDouble = Math.random();

            long y=Math.round(randowmDouble*100);

       

            System.loadLibrary("testNDK");

           

            long z = add(x, y);

            String msg=x+" + "+y+" = "+z;

            tv.setText(msg);

    }

       

    public native long add(long x,long y);

    }


    上面的
    System.loadLibrary("testNDK");
    没有加static作为静态代码块。

    5、在项目根目录创建jni目录

    6、给项目添加Native Support
    项目右键/Android Tools/Add Native Support
    会弹出框,设置编译生成的共享库文件*.so 的文件名
    Library Name:lib***.so
    上面的***是供输入的名称,默认就是项目名,即:testNDK,这样最后产生的库文件名称为libtestNDK.so,存放在lib目录下面对应的CPU下面。

    上面的对话框确认之后,会自动在上一步的jni目录中生成两个文件:
    testNDK.cpp
    Android.mk
    7、上面的testNDK.cpp文件就一行
    #include  
    剩下来的是要写代码去实现安卓中的那个声明过的native方法add
    8、Android.mk文件已经帮我们写好了:
    LOCAL_PATH :=$(call my-dir)

    Include $(CLEAR_VARS)

    LOCAL_MODULE :=testNDK
    LOCAL_SRC_FILES :=testNDK.cpp

    Include $(BUILD_SHARED_LIBRARY)
    这个代完全不必去改动它,暂时也可以不必理会里面的具体含义。

    9、编写C语言的函数体
    JNIEXPORT jlong JNICALL Java_cn_maxma_testndk_MainActivity_add(
    JNIEnv * env,jclass thiz,jlong x,jlong y)
    {
    return x+y;
    }
    注意:上面的jclass的参数改成了thiz是因为this是关键字 

    10、增加C/C++搜索路径
    项目属性->C/C++ General->Paths and Symbols->Add
    添加NDK中的目录
      JNI+NDK编程总结

    确认之后,上面的程序代码下的错误指示波浪线消失。

    11、为项目添加新的Builder
    项目属性->Builders->New->Program:
    JNI+NDK编程总结

    【Refresh】接着切换到Refresh选项卡:勾选Recursively include sub-folders,即递归进所有的子目录。
    【Build Options】接着切换到Build Options,勾选最后一个选项,然后点击“Specify Resources…”,选择项目中的jni目录。

    13、保存上面的程序,eclipse会自动调用ndk进行编译,结果:
    JNI+NDK编程总结
    [armeabi] Compile++ thumb: testNDK <= testNDK.cpp
    [armeabi] StaticLibrary  : libstdc++.a
    [armeabi] SharedLibrary  : libtestNDK.so
    [armeabi] Install        : libtestNDK.so => libs/armeabi/libtestNDK.so
    上面最后一句的意思是生成了*.so文件,并且存放到libs/armeabi/目录中了。

    如果NDK的版本更高些的话,比如R12e,会编译出多个so文件,最后的行数会大大增加:
    [x86] install :libtestNDK.so  =>  libs/x86/libtestNDK.so
    [mips] install :libtestNDK.so  =>  libs/mips/libtestNDK.so

    14、各种错误现象
    W: No implementation found for native Lcn/maxma/testndk/MainActivity;.add:(JJ)J
    E: FATAL EXCEPTION: main
    E: java.lang.IllegalStateException: Could not execute method of the activity

  • 相关阅读:
    5 Things Every Manager Should Know about Microsoft SharePoint 关于微软SharePoint每个经理应该知道的五件事
    Microsoft SharePoint 2010, is it a true Document Management System? 微软SharePoint 2010,它是真正的文档管理系统吗?
    You think you use SharePoint but you really don't 你认为你使用了SharePoint,但是实际上不是
    Introducing Document Management in SharePoint 2010 介绍SharePoint 2010中的文档管理
    Creating Your Own Document Management System With SharePoint 使用SharePoint创建你自己的文档管理系统
    MVP模式介绍
    权重初始化的选择
    机器学习中线性模型和非线性的区别
    神经网络激励函数的作用是什么
    深度学习中,交叉熵损失函数为什么优于均方差损失函数
  • 原文地址:https://www.cnblogs.com/maxma/p/9169574.html
Copyright © 2011-2022 走看看