Android-JNI(2)-NDK环境搭建和简单案例

1.下载NDK

这里写图片描述

2.解压到相应目录这里写图片描述

3.新建项目并建立jni文件

这里写图片描述

4.配置NDK-build相关环境(由于目前版本ndk已经集成了NDK-build,因此不需要再linux模拟环境下运行)

  • 1
    这里写图片描述
  • 2
    这里写图片描述
  • 3
    这里写图片描述

  • 4
    这里写图片描述

  • 5这里写图片描述

完成

hello world 程序

  • 1.定义函数

      public native String helloWorldFromC();
    
  • 2.jni下建立hello.c 【要实现c代码所在的文件】

    #include <stdio.h>
    #include <jni.h>
    jstring Java_com_example_ndkhelloworld_MainActivity_helloWorldFromC(JNIEnv* env,jobject obj)
    {
        return (*env)->NewStringUTF(env,"helloworldFormC");
    }
    
  • 变量类型符合jni规范,具体可取ndk里面查看jni.h文件

  • 函数名java_包名类名函数名。 中间的.改为_
  • *env执行JNIEnv
  • *JNIEnv执行一个结构体
  • 结构体下定义了一个NewStringUT生成一个jString字符串
  • 两个参数 一个是env,一个是*char即字符串就行。
  • 也可在对应目录下使用javah com.example.ndkhelloworld.MainActivity 生成头文件。
  • 3.jni下建立Android.mk文件

    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    
    LOCAL_MODULE    := hello
    LOCAL_SRC_FILES := hello.c
    
    include $(BUILD_SHARED_LIBRARY)
    

    *LOCAL_SRC_FILES为c源文件这里即上面实现的hello.c
    *LOCAL_MODULE生成的包文件 可以任意取。

  • 4.chean下project则会自动编译,因为在配置build的时候勾选了。 编译完成后在libs下生成libhello.so文件
    这里写图片描述

  • 5.load相关包。这里LoadLibrary里面的字符串必须和Android.mk LOCAL_MODULE后面一致
    这里写图片描述

  • 6运行程序 这里必须使用 ARM为cup的模拟器。x86的不行。x86为windows上的。不能再linux上跑。所以使用ARM手机的cpu的模拟器

    这里写图片描述

代码

MainActivity.java
package com.example.ndkhelloworld;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends Activity {
    public native String helloWorldFromC();
    static{
        System.loadLibrary("hello");
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView tv = (TextView) findViewById(R.id.tv);
        tv.setText(helloWorldFromC());
    }
}
hello.c
#include <stdio.h>
#include <jni.h>

jstring Java_com_example_ndkhelloworld_MainActivity_helloWorldFromC
                                        (JNIEnv* env,jobject obj){
    return (*env)->NewStringUTF(env,"helloworldFormC");
}

jni常见错误

  • 未加参数
  • 链接错误, 方法名出错
  • log未打印任何信息 一般是c语言运行错误。
  • 编译时报错, 则是c代码有编译错误。
  • 没有Android.mk 文件
  • Android.mk 文件有错
  • 引用别人.so 函数库 需要你自己native方法对应类的包名 和之前打包成.so函数库的包名一致

Android.mk

  • LOCAL_PATH := $(call my-dir) // 返回当前c代码目录
  • include $(CLEAR_VARS) // 清除了所有 已local 开头的配置文件 唯独不清除LOCAL_PATH
  • LOCAL_MODULE := hello // 库函数的名字 严格遵守makefile 格式 lib .so
  • LOCAL_SRC_FILES := Hello.c
  • include $(BUILD_SHARED_LIBRARY) //加入库函数
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值