zoukankan      html  css  js  c++  java
  • Android jni helloworld

    新建Android项目,设置布局:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context=".MainActivity" >
    
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="click"
            android:text="调用C函数" />
    </RelativeLayout>

    jni开发的步骤

    ①写java代码 声明本地方法 用到native关键字 本地方法不用去实现

    ②项目根目录下创建jni文件夹

    ③在jni文件夹下创建.c文件

    ④ 导入<jni.h>

    #include<stdlib.h>
    #include<stdio.h>
    #include<jni.h>
    
    //JNIEnv* env是JNINativeInterface的二级指针
    //JNIEnv是JNINativeInterface的一级指针
    //JNINativeInterface结构体中定义了大量的函数指针,这些函数指针在jni开发中很常用
    //(*env)->调用结构体中的函数指针
    //jobject 调用本地函数的java对象,在这个例子中就是MainActivity的实例
    //C本地函数命名规则Java_包名_类名_本地方法名
    //jstring (*NewStringUTF)(JNIEnv*, const char*)
    jstring Java_com_wuyudong_jnihello_MainActivity_helloFromC(JNIEnv* env, jobject thiz) {
    
        char* str = "hello from c!";
        return (*env)->NewStringUTF(env, str);
    
    }

    ⑤ 创建Android.mk makefile 告诉编译器.c的源文件在什么地方,要生成的编译对象的名字是什么

    LOCAL_PATH := $(call my-dir)
        include $(CLEAR_VARS)
        LOCAL_MODULE := hello #指定了生成的动态链接库的名字
        LOCAL_SRC_FILES := hello.c #指定了C的源文件叫什么名字
        include $(BUILD_SHARED_LIBRARY)

    ⑥ 调用ndk-build编译c代码生成动态链接库.so文件 文件的位置 lib->armeabi->.so

    项目的路径:F:workspace_sdk41_JNIHelloworld

    打开cmd

    输入:cd /d F:workspace_sdk41_JNIHelloworld

    输入:ndk-build

    编译速度很快,生成的文件在libs目录下,刷新项目就可以看到

    ⑦ 在java代码中加载动态链接库 System.loadlibrary("动态链接库的名字"); Android.mkLOCAL_MODULE所指定的名字

    MainActivity.java

    package com.wuyudong.jnihello;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.view.View;
    import android.widget.Toast;
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
        public void click(View view) {
            System.loadLibrary("hello");
            String result = helloFromC();
            Toast.makeText(getApplicationContext(), result, 0).show();
        }
    
        // 声明本地方法 使用native关键字 本地方法不用实现
        public native String helloFromC();
    }

    最后部署项目到模拟器

  • 相关阅读:
    果断MARK Flex的那些资源
    利用wamp配置虚拟主机
    wamp+cmd命令行配置zend框架
    [MVVM Light] ViewModelBase
    The WPF Tab Control Inside and Out
    21 Important FAQ questions for WPF and SilverLight
    MIME 多用途互联网邮件扩展
    The Future of Client App Dev : WPF and Silverlight Convergence
    View 中DataContext的设置问题
    [MVVM Light]Messenger 的使用
  • 原文地址:https://www.cnblogs.com/wuyudong/p/5631678.html
Copyright © 2011-2022 走看看