android 通过JNI调用C/C++代码(linux)

来源:互联网 发布:js时间段选择插件 编辑:程序博客网 时间:2024/05/29 17:29

1.先安装好jdk,ndk,进行准备

2.在eclipse下创建Android一个工程:Jnitest

JniTest.java

public class JniTest extends Activity {
TextView tv1;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_jni_test);
tv1 = (TextView) findViewById(R.id.textView1);
tv1.setText(welcome("呵呵"));
}

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

public native String welcome(String who);

}

3.编译该工程:使用project--clean--当前工程。生成相应的.class文件。

4.打开终端:cd 到当前项目,比如说我的是 cd workspace/Jnitest,然后执行javah -classpath bin/classes -d jni 包名.类名,我的是javah -classpath bin/classes -d jni com.example.jnitest.JniTest.执行成功后会在项目目录下生成一个jni文件夹,里面有相对应的.h文件,我的是com_example_jnitest_JniTest.h。

5.在jni文件下编写c++文件(或c文件)

com_example_jnitest_JniTest.cpp

#include "com_example_jnitest_JniTest.h"
#include <string.h>
#include <jni.h>
JNIEXPORT jstring JNICALL Java_com_example_jnitest_JniTest_welcome(JNIEnv *env,
jobject obj, jstring who) {
return env->NewStringUTF("Hello 旺旺 !");;
}

6.在jni文件下编写Android.mk文件

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libjnitest
LOCAL_SRC_FILES := com_example_jnitest_JniTest.cpp
include $(BUILD_SHARED_LIBRARY)

7.在终端下cd到该工程目录下:cd workspace/Jnitest

执行:ndk-build

执行成功会出现

[armeabi] Compile++ thumb: jnitest <= com_example_jnitest_JniTest.cpp

[armeabi] SharedLibrary  : libjnitest.so
    [armeabi] Install        : libjnitest.so => libs/armeabi/libjnitest.so

生成了 .so 文件,我们可以在 libs/armeabi/ 目录下找到该文件

执行不成功则会出现相应的错误,自己查找改错。

8.运行该工程则会在textView里面显示“Hello 旺旺 !”


注意:

1.如果你编写的是.c文件,那么则要做修改输出

jstringJava_com_example_jnitest_JniTest_welcome(JNIEnv *env,
jobject obj, jstring who) {
return (*env)->NewStringUTF(env, "hello,旺旺!");
}

这是c和c++文件的区别。

2.在ndk-build之后可能会出现:APP_PLATFORM android-19 is larger than android:minSdkVersion 8 in ./AndroidManifest.xml 

这不影响我们的操作,如果想去掉它,则在Android,mk文件下添加:APP_PLATFORM := android-8就可以了。

3.编写c和c++文件的时候注意要和.h文件里面的函数名称相同。

GOOD LUCY!!!!!!!!



0 0