0
点赞
收藏
分享

微信扫一扫

JNI+NDK编程总结

Spinach菠菜 2022-08-18 阅读 59

软件版本的选择:

1、ADT-Bundle:adt-bundle-windows-x86_64-20131030

理由:这个版本自带Native Developer Tools支持,是否支持看Preferences,有NDK项就是支持了。可以安装插件,这里略过,选择集成了最简单。

 

JNI+NDK编程总结_c++

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);

random();

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

   

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编程总结_android_02

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

11、为项目添加新的Builder

项目属性->Builders->New->Program:

JNI+NDK编程总结_c++_03

【Refresh】接着切换到Refresh选项卡:勾选Recursively include sub-folders,即递归进所有的子目录。

【Build Options】接着切换到Build Options,勾选最后一个选项,然后点击“Specify Resources…”,选择项目中的jni目录。

13、保存上面的程序,eclipse会自动调用ndk进行编译,结果:

JNI+NDK编程总结_c++_04

[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

举报

相关推荐

0 条评论