【android JNI开发】android之JNI第一课环境搭建+“hello world!”

mac2022-06-30  104

开发工具:

android-ndk-r8b

eclipse-indigo

android-sdk-r10(2.3.3SDK)

ubuntu 10.10

CDT(非必须)

    其实使用NDK开发已经有些时日了,只是一直犯懒就没有发博文来有条理的记录下。今天终于下定决心开始第一步。

1.android开发环境就不多说了,网上一搜一大片,这里主要将NDK.在android官网上下载NDK.然后解压。然后就是将ndk加入环境变量。

gedit ~/.bashrc

打开后,在文件最后加入下面2行代码:

ANDROIDNOOT=$HOME/android-ndk-r8b export PATH=$ANDROIDROOT:$PATH

然后在终端输入:

ndk-build

如果在终端上显示

lichen@lichen-Lenovo-IdeaPad-Y550:~$ ndk-build Android NDK: Could not find application project directory ! Android NDK: Please define the NDK_PROJECT_PATH variable to point to it. /home/lichen/android-ndk-r8b/build/core/build-local.mk:130: *** Android NDK: Aborting . Stop.

就说明已经NDK配置成功啦。

2.现在就是打开eclipse,建立一个android工程,取名为JNITest。

然后在该工程下建立jni和libs,2个文件夹。到这里位置,配置就基本完成了,然后就是写代码啦~!

3.首先是先编写本地的native方法。

public class JNITest { public native String printHello(); }

4.使用命令行编译。

javac src/com/lee/main/JNITest.java

5.生成.h类型的头文件,这个文件以供C文件找到想到相关1:D头文件,否为会加载本地.so库失败。

cd src javah -o hellowold.h com.lee.main.JNITest mv helloworld.h ../jni

javah -o 这个命令主要是为了设置生成.h文件名字(非必须)。然后要把这个生成的文件剪切到jni这个文件夹中。

6.编写CPP文件和Android.mk

   这个时候打开刚才编译的头文件。

/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_lee_main_JNITest */ #ifndef _Included_com_lee_main_JNITest #define _Included_com_lee_main_JNITest #ifdef __cplusplus extern "C" { #endif /* * Class: com_lee_main_JNITest * Method: printHello * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_lee_main_JNITest_printHello //这个就是我们在CPP文件中的函数名 (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif

 

然后在jni文件夹下新建一个文件,名字叫做printhello.cpp,编写代码:

#include "helloworld.h" //这个头文件必须添加,否则会产生UnsatisfiedLinkError #include "string.h" jstring JNICALL Java_com_lee_main_JNITest_printHello (JNIEnv *env, jobject) { return (env)->NewStringUTF("Hello I'm lee"); }

快到最后一步啦,接下来就是编写Android.mk文件

同样在jni文件夹下新建文件,名字叫做Android.mk,编写代码:

LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := printhello LOCAL_SRC_FILES := printhello.cpp include $(BUILD_SHARED_LIBRARY) LOCAL_MODULE 这个意思是要生成的so文件的名字是如何的,生成的文件命名规则是lib+自定义名字.so。 LOCAL_SRC_FILES 这个是你要添加到so库中的文件,如果多个文件请用”\“隔开。 然后打开终端。输入: cd jni ndk-build

Compile++ thumb : printhello <= printhello.cppIn file included from /home/lichen/workspace/JNITest/jni/printhello.h:2:0,

from /home/lichen/workspace/JNITest/jni/printhello.cpp:1:/home/lichen/android-ndk-r8b/platforms/android-14/arch-arm/usr/include/jni.h:592:13: note: the mangling of 'va_list' has changed in GCC 4.4SharedLibrary : libprinthello.soInstall : libprinthello.so => libs/armeabi/libprinthello.so

出现上面的信息,就说明lib生成完毕啦。

7.最后一步就是写JAVA代码啦,将lib加载进来。

import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class Main extends Activity { /** Called when the activity is first created. */ private TextView mTextView = null; private JNITest test = new JNITest(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mTextView = (TextView) findViewById(R.id.textview); mTextView.setText(test.printHello()); } static { System.loadLibrary("printhello"); } }

OK,大功告成啦。来看结果图。

最后吐槽下。ubuntu下截图真是坑啊~!

转载于:https://www.cnblogs.com/ValentineLee/archive/2012/08/15/2640229.html

最新回复(0)