随笔 - 65  文章 - 0  评论 - 21  阅读 - 32万

【学习Android NDK开发】Java通过JNI调用native方法

参考:Android NDK,sample/hello-jni示例项目

系统环境:Ubuntu 12.04 LTS 32-bit

 

1、准备工作

打开Eclipse,新建Android项目:

Application Name: HelloJNI

Project Name: HelloJNI

Package Name: com.example.hellojni

Activity: MainActivity

Activity Layout: activity_main.xml

 

修改activity_main.xml,为<TextView/>标签,添加"android:id"属性,删除“android:text”属性:

复制代码
<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" >

    <TextView
        android:id="@+id/activity_main_textview_hello"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        tools:context=".MainActivity" />

</RelativeLayout>
复制代码

 

修改src/com/example/hellojni/MainActivity.java,添加layout文件TextView对象的引用:

复制代码
package com.example.hellojni;

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

public class MainActivity extends Activity {
    
    private TextView helloTextView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        helloTextView = (TextView) findViewById(R.id.activity_main_textview_hello);
    }

}
复制代码

 

2、编写Java文件

在MainActivity类中

声明native方法

public native String hello();

加载.so库

static {
    System.loadLibrary("mylib");
}

TextView显示函数hello返回的字符串

helloTextView.setText(hello());

MainActivity.java代码如下:

复制代码
package com.example.hellojni;

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

public class MainActivity extends Activity {
    
    static {
        System.loadLibrary("mylib");
    }
    
    private TextView helloTextView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        helloTextView = (TextView) findViewById(R.id.activity_main_textview_hello);
        helloTextView.setText(hello());
    }

    public native String hello();
}
复制代码

 

3、编写C文件

a.在项目HelloJNI目录下,建立文件夹jni

 

b.使用javah工具生成.h文件

打开终端,切换当前目录到Eclipse项目目录workspace

cd HelloJNI/bin/classes

javah -d http://www.cnblogs.com/jni/ -jni com.example.hellojni.MainActivity

javah produces C header files and C source files from a Java class. These files provide the connective glue that allow your Java and C code to interact.

javah的使用方法:http://docs.oracle.com/javase/6/docs/technotes/tools/windows/javah.html

刷新项目,目录jni下生成一个.h文件

 

c.实现hello方法

在jni目录下,新建并编辑文件com_example_hellojni_MainActivity.c

include之前javah生成的.h文件,实现Java_com_example_hellojni_MainActivity_hello函数

#include "com_example_hellojni_MainActivity.h"

JNIEXPORT jstring JNICALL Java_com_example_hellojni_MainActivity_hello
  (JNIEnv *env, jobject thiz) {
    return (*env) -> NewStringUTF(env, "Hello JNI!");
}

 

4、编写Android.mk文件

在jni/目录下,新建make文件Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := mylib
LOCAL_SRC_FILES := com_example_hellojni_MainActivity.c

include $(BUILD_SHARED_LIBRARY)

注:关于Android.mk,将在单独一篇博客中说明

 

5、编译运行

a.编译生成共享库

切换当前目录到项目根目录下,即HelloJNI/

使用Android NDK中自带的工具ndk-build,编译jni/目录下的.c文件,在libs/armeabi目录下生成.so共享库

 

b.运行项目

显示“Hello JNI!”,谢谢!

 

 

posted on   Anthony Li  阅读(795)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
< 2012年9月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 1 2 3 4 5 6

博客园博客已停止更新,博客地址:dyinigbleed.com

点击右上角即可分享
微信分享提示