NDK入门 第一个NDK项目

1 新建一个android项目
在新建的项目中新建类JniTest,并在类中编写native方法。
这里写图片描述

2 使用cmd命令生成.h文件
我的teminal不能用了 我擦,所以我用的cmd。
首先rebuild project一下。然后会看到build下生成的classes文件夹。
这里写图片描述

使用doc命令,首先切换到debug的目录下。

cd D:\Development\StudioProject\Application\app20-ndk\build\intermediates\classes\debug

然后使用命令

javah -jni -classpath . com.yeliang.app20_ndk.JniTest

这里写图片描述

然后会发现生成的.h
这里写图片描述

.h文件内容
这里写图片描述

3 编写c代码
在main文件夹下新建jni文件夹,并把JniTest.h文件拷贝到此文件夹下
这里写图片描述

新建c文件
这里写图片描述

把刚才的.h文件中的方法拷贝到此,并实现
这里写图片描述
此方法只是简单的返回了一个字符串。

4 加载so库
在gradle中加如下配置

    ndk{
       moduleName "yeliang-so-name"         //生成的so名字
       abiFilters "armeabi", "armeabi-v7a", "x86"  //输出指定三种abi体系结构下的so库。目前可有可无。
        }

注意放到defaultConfig中:
这里写图片描述

在JniTest中添加如下代码

static{
        System.loadLibrary("yeliang-so-name");
    }

这里写图片描述

在gradle.properties中添加如下

android.useDeprecatedNdk=true

这里写图片描述

5 调用so库中的内容

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView textView = (TextView)findViewById(R.id.tv);
        textView.setText(JniTest.setText());
    }
}

运行结果
这里写图片描述

会看到生成的so
这里写图片描述

如果遇到错误:
这里写图片描述

意思是没有声明此项目支持ndk,需要在gradle(Project)中配置这一句话

android.useDeprecatedNdk=true

如果遇到错误;

Error:Execution failed for task ':app:incrementalDebugJavaCompilationSafeguard'.
> java.io.IOException: Could not delete path app\build\intermediates\classes\debug'.

说明在rebuild时候,无法删除你的build下的文件。可能你在别的地方打开了此文件。比如cmd。之前不是在cmd中切换到debug目录下,用于生成.h。所以此时你需要关闭打开你文件夹的应用。然后重新rebuild。

//--------Exception---------------- private native void ExceptionDemo(); private native void FatalErrorDemo();//一般调试时使用 //-----c调用java成员函数--------- private native void AccessStaticMethodDemo(Dummy p); private native void AccessInstaceMethodDemo(Dummy p); //------c调用java数据成员------------ private int intF; private String strF; private int[] intArrF; private Dummy dummyF; private static int sintF = 111; private static String sstrF = "static str"; private static int[] sintArrF = {1,2,3}; private static Dummy sdummyF = new Dummy(333); private native void AccessStaticFiledDemo(); private native void AccessInstanceFiledDemo(); //------------数组------------- private native void GetArrayLengthDemo(double[] p1,Dummy[] p2,int[][] p3); //此代码有问题,错误写法仅供参考 private native void IllegalDirectAccessDemo(int[] p); private native Dummy[] NewObjectArrayDemo(Dummy p); private native int[] NewIntArrayDemo(); private native Dummy GetSetObjectArrayDemo(Dummy[] p1,Dummy p2); private native void GetReleaseIntArrayDemo(int[] p); private native void GetSetIntArrayRegionDemo(int[] p1); //-----类实例------ private native Contact GetObjectClassDemo(Contact p); private native void IsInstanceOfDemo(); private native Contact AllocObjectDemo(); private native Contact NewObjectDemo(String name,int age); private native Contact NewObjectADemo(String name,int age); private native Contact NewObjectVDemo(String name,int age); //-----类jclass----- private native void findClassDemo(); private native void GetSuperClassDemo(); //---继承关系判断-- private native void IsAssignableFromDemo(); //-----全局 弱引用 局部----- private native void referenceAssignmentAndNew(String p); private native void localReference(String p, boolean b); private native void globalReference(String p, boolean b); private native void weakReference(String p, boolean b); //----字符串处理 (java中编码为utf-16,android为utf-8),jni不能直接使用string---- private native String passStringReturnString(String string); //--基本类型--- private native int add(int a, int b); private native boolean passBooleanReturnBoolean(boolean b); private native byte passByteReturnByte(byte b); private native char passCharReturnChar(char c); private native short passShortReturnShort(short s); private native int passIntReturnInt(int i); private native long passLongReturnLong(long l); private native float passFloatReturnFloat(float f); private native double passDoubleReturnDouble(double d);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值