以上在windows中完成.
2.使用javah命令生成C/C++的.h文件.注意类要包含包名,路径文件夹下要包含所有包中的类,否则会报找不到类的错误.classpath参数指定到包名前一级文件夹,文件夹层次结构要符合java类的组织层次结构.
javah -classpath /jnitest/bin com.hello.jnitest.Nadd
com_hello_jnitest_Nadd .h文件:
3.编辑.c文件实现native方法.
com_hello_jnitest_Nadd.c文件:
4.编译.c文件生存动态库.
arm-none-linux-gnueabi-gcc -I/home/a/work/android/jdk1.6.0_17/include -I/home/a/work/android/jdk1.6.0_17/include/linux -fpic -c com_hello_jnitest_Nadd.c
arm-none-linux-gnueabi-ld -T/home/a/CodeSourcery/Sourcery_G++_Lite/arm-none-linux-gnueabi/lib/ldscripts/armelf_linux_eabi.xsc -share -o libNadd.so com_hello_jnitest_Nadd.o
得到libNadd.so文件.
以上在ubuntu中完成.
5.将相应的动态库文件push到avd的system/lib中:adb push libNadd.so /system/lib.若提示Read-only file system错误,运行adb remount命令,即可.
Adb push libNadd.so /system/lib
6.在eclipsh中运行原应用程序即可.
以上在windows中完成.
对于一中生成的so文件也可采用二中的方法编译进apk包中.只需在工程文件夹中建libs\armeabi文件夹(其他文件夹名无效,只建立libs文件夹也无效),然后将so文件拷入,编译工程即可.
二.使用NDK生成本地方法(ubuntu and windows)
1.安装NDK:解压,然后进入NDK解压后的目录,运行build/host-setup.sh(需要Make 3.81和awk).若有错,修改host-setup.sh文件:将#!/bin/sh修改为#!/bin/bash,再次运行即可.
2.在apps文件夹下建立自己的工程文件夹,然后在该文件夹下建一文件Application.mk和项project文件夹.
Application.mk文件:
APP_PROJECT_PATH := $(call my-dir)/project
APP_MODULES := myjni
3.在project文件夹下建一jni文件夹,然后新建Android.mk和myjni.c.这里不需要用javah生成相应的.h文件,但函数名要包含相应的完整的包、类名.
4.编辑相应文件内容.
Android.mk文件:
myjni.c文件:
myjni文件组织:
a@ubuntu:~/work/android/ndk-1.6_r1/apps$ tree myjni
myjni
|-- Application.mk
`-- project
|-- jni
| |-- Android.mk
| `-- myjni.c
`-- libs
`-- armeabi
`-- libmyjni.so
4 directories, 4 files
5.编译:make APP=myjni.
以上内容在ubuntu完成.以下内容在windows中完成.当然也可以在ubuntu中完成.
6.在eclipsh中创建android application.将myjni中自动生成的libs文件夹拷贝到当前工程文件夹中,编译运行即可.
NdkTest.java文件:
2.使用javah命令生成C/C++的.h文件.注意类要包含包名,路径文件夹下要包含所有包中的类,否则会报找不到类的错误.classpath参数指定到包名前一级文件夹,文件夹层次结构要符合java类的组织层次结构.
javah -classpath /jnitest/bin com.hello.jnitest.Nadd
com_hello_jnitest_Nadd .h文件:
- /* DO NOT EDIT THIS FILE - it is machine generated */
- #include <jni.h>
- /* Header for class com_hello_jnitest_Nadd */
- #ifndef _Included_com_hello_jnitest_Nadd
- #define _Included_com_hello_jnitest_Nadd
- #ifdef __cplusplus
- extern"C" {
- #endif
- /*
- * Class: com_hello_jnitest_Nadd
- * Method: nadd
- * Signature: (II)I
- */
- JNIEXPORT jint JNICALL Java_com_hello_jnitest_Nadd_nadd(JNIEnv *, jobject, jint, jint);
- #ifdef __cplusplus
- }
- #endif
- #endif
3.编辑.c文件实现native方法.
com_hello_jnitest_Nadd.c文件:
- #include <stdlib.h>
- #include "com_hello_jnitest_Nadd.h"
- JNIEXPORT jint JNICALL Java_com_hello_jnitest_Nadd_nadd(JNIEnv * env, jobject c, jint a, jint b){
- return (a+b);
- }
4.编译.c文件生存动态库.
arm-none-linux-gnueabi-gcc -I/home/a/work/android/jdk1.6.0_17/include -I/home/a/work/android/jdk1.6.0_17/include/linux -fpic -c com_hello_jnitest_Nadd.c
arm-none-linux-gnueabi-ld -T/home/a/CodeSourcery/Sourcery_G++_Lite/arm-none-linux-gnueabi/lib/ldscripts/armelf_linux_eabi.xsc -share -o libNadd.so com_hello_jnitest_Nadd.o
得到libNadd.so文件.
以上在ubuntu中完成.
5.将相应的动态库文件push到avd的system/lib中:adb push libNadd.so /system/lib.若提示Read-only file system错误,运行adb remount命令,即可.
Adb push libNadd.so /system/lib
6.在eclipsh中运行原应用程序即可.
以上在windows中完成.
对于一中生成的so文件也可采用二中的方法编译进apk包中.只需在工程文件夹中建libs\armeabi文件夹(其他文件夹名无效,只建立libs文件夹也无效),然后将so文件拷入,编译工程即可.
二.使用NDK生成本地方法(ubuntu and windows)
1.安装NDK:解压,然后进入NDK解压后的目录,运行build/host-setup.sh(需要Make 3.81和awk).若有错,修改host-setup.sh文件:将#!/bin/sh修改为#!/bin/bash,再次运行即可.
2.在apps文件夹下建立自己的工程文件夹,然后在该文件夹下建一文件Application.mk和项project文件夹.
Application.mk文件:
APP_PROJECT_PATH := $(call my-dir)/project
APP_MODULES := myjni
3.在project文件夹下建一jni文件夹,然后新建Android.mk和myjni.c.这里不需要用javah生成相应的.h文件,但函数名要包含相应的完整的包、类名.
4.编辑相应文件内容.
Android.mk文件:
- # Copyright (C) 2009 The Android Open Source Project
- #
- # Licensed under the Apache License, Version 2.0 (the "License");
- # you may not use this file except in compliance with the License.
- # You may obtain a copy of the License at
- #
- # http://www.apache.org/licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing, software
- # distributed under the License is distributed on an "AS IS" BASIS,
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- # See the License for the specific language governing permissions and
- # limitations under the License.
- #
- LOCAL_PATH := $(call my-dir)
- include $(CLEAR_VARS)
- LOCAL_MODULE := myjni
- LOCAL_SRC_FILES := myjni.c
- include $(BUILD_SHARED_LIBRARY)
myjni.c文件:
- #include <string.h>
- #include <jni.h>
- jstring
- Java_com_hello_NdkTest_NdkTest_stringFromJNI( JNIEnv* env,jobject thiz ){
- return (*env)->NewStringUTF(env, "Hello from My-JNI !");
- }
myjni文件组织:
a@ubuntu:~/work/android/ndk-1.6_r1/apps$ tree myjni
myjni
|-- Application.mk
`-- project
|-- jni
| |-- Android.mk
| `-- myjni.c
`-- libs
`-- armeabi
`-- libmyjni.so
4 directories, 4 files
5.编译:make APP=myjni.
以上内容在ubuntu完成.以下内容在windows中完成.当然也可以在ubuntu中完成.
6.在eclipsh中创建android application.将myjni中自动生成的libs文件夹拷贝到当前工程文件夹中,编译运行即可.
NdkTest.java文件:
- import android.app.Activity;
- import android.os.Bundle;
- import android.widget.TextView;
- publicclass NdkTest extends Activity {
- /** Called when the activity is first created. */
- @Override
- publicvoid onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- TextView tv =new TextView(this);
- tv.setText( stringFromJNI() );
- setContentView(tv);
- }
- publicnative String stringFromJNI();
- static {
- System.loadLibrary("myjni");
- }
- }