NDK JNI 程序实现步骤

NDK JNI 程序实现步骤

在 Activity 里调用 native 方法,MainActivity 上放个 button,点击后调用 native 的 helloJNI 获取内容并显示。

1. 编写带有native声明的方法的java类

public class MainActivity extends Activity {

    static{
    //加载libhello.so,后面会去编写
        System.loadLibrary("hello");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void callJNI(View view) {
        String text = helloJNI();
        Toast.makeText(this, text, Toast.LENGTH_LONG).show();
    }

    /**
     * 本地方法
     */
    private native String helloJNI();

}

2. 使用javac命令编译所编写的java类

eclipse 默认就帮我们干了

3. 使用javah + java类名生成扩展名为h的头文件

javah在jdk的bin目录里

首先切换到项目目录

cd /d D:\workspace_android\TestJNI\src

运行cygwin.bat,执行

$ javah -jni com.example.testjni.MainActivity

然后在src目录就可以看到生成了com_example_testjni_MainActivity.h文件

4. 使用C/C++实现本地方法

在工程目录下创建一个jni目录,该目录下编写一个hello.c文件,并把com_example_testjni_MainActivity.h文件复制到该目录下,内容如下:

#include "com_example_testjni_MainActivity.h"

JNIEXPORT jstring JNICALL Java_com_example_testjni_MainActivity_helloJNI(JNIEnv *env, jobject){
    return (*env)->NewStringUTF(env, "text from c");
}

5. 将C/C++编写的文件生成动态连接库

在jni目录下(即hello.c 同级目录下)新建一个Android.mk文件,Android.mk 文件是 Android 的 makefile文件,参考sample/hellojni项目

#
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello
LOCAL_SRC_FILES := hello.c

include $(BUILD_SHARED_LIBRARY)

然后就可以在cygwin里切到这里执行ndk-build了,正常的话就可以生成so了

可能遇到的问题:

  1. D:/workspace_android/TestJNI/jni/hello.c:3:1: error: parameter name omitted

hello.c 里 Java_com_example_testjni_MainActivity_helloJNI(JNIEnv *env, jobject)忘给第二个参数了,补上Java_com_example_testjni_MainActivity_helloJNI(JNIEnv *env, jobject thiz),再次执行ndk-build

$ ndk-build
[armeabi] Compile thumb  : hello <= hello.c
[armeabi] SharedLibrary  : libhello.so
[armeabi] Install        : libhello.so => libs/armeabi/libhello.so

刷新eclipse项目就能看到libs/armeabi/libhelle.so

6. 测试

嗯,就那么回事了,单击按钮后蹦出个“text from c”……然后,就没有然后了…

下载

感谢:http://www.cnblogs.com/devinzhang/archive/2012/02/29/2373729.html

你可能感兴趣的:(jni,NDK)