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

  • 相关阅读:
    UOJ388 [UNR #3] 配对树
    洛谷P6151 [集训队作业2019] 青春猪头少年不会梦到兔女郎学姐
    CF908H New Year and Boolean Bridges
    CF704C Black Widow
    CF1338
    CF1361
    CF1110H Modest Substrings
    CF1322
    CF1182F Maximum Sine
    Elastic Stack(ELK)
  • 原文地址:https://www.cnblogs.com/maxma/p/9169574.html
Copyright © 2011-2022 走看看