初学JNI知识(三)

以上在windows中完成.

  2.使用javah命令生成C/C++的.h文件.注意类要包含包名,路径文件夹下要包含所有包中的类,否则会报找不到类的错误.classpath参数指定到包名前一级文件夹,文件夹层次结构要符合java类的组织层次结构.
  javah -classpath /jnitest/bin com.hello.jnitest.Nadd
  com_hello_jnitest_Nadd .h文件:


  1. /* DO NOT EDIT THIS FILE - it is machine generated */
  2. #include <jni.h>
  3. /* Header for class com_hello_jnitest_Nadd */
  4. #ifndef _Included_com_hello_jnitest_Nadd

  5. #define _Included_com_hello_jnitest_Nadd

  6. #ifdef __cplusplus

  7. extern"C" {

  8. #endif

  9. /*
  10. * Class: com_hello_jnitest_Nadd
  11. * Method: nadd
  12. * Signature: (II)I
  13. */

  14. JNIEXPORT jint JNICALL Java_com_hello_jnitest_Nadd_nadd(JNIEnv *, jobject, jint, jint);
  15. #ifdef __cplusplus
  16. }

  17. #endif

  18. #endif

       3.编辑.c文件实现native方法.
  com_hello_jnitest_Nadd.c文件:


  1. #include <stdlib.h>
  2. #include "com_hello_jnitest_Nadd.h"
  3. JNIEXPORT jint JNICALL Java_com_hello_jnitest_Nadd_nadd(JNIEnv * env, jobject c, jint a, jint b){
  4. return (a+b);
  5. }

       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文件:

  1. # Copyright (C) 2009 The Android Open Source Project
  2. #
  3. # Licensed under the Apache License, Version 2.0 (the "License");
  4. # you may not use this file except in compliance with the License.
  5. # You may obtain a copy of the License at
  6. #
  7. # http://www.apache.org/licenses/LICENSE-2.0
  8. #
  9. # Unless required by applicable law or agreed to in writing, software
  10. # distributed under the License is distributed on an "AS IS" BASIS,
  11. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. # See the License for the specific language governing permissions and
  13. # limitations under the License.
  14. #

  15. LOCAL_PATH := $(call my-dir)
  16. include $(CLEAR_VARS)
  17. LOCAL_MODULE := myjni
  18. LOCAL_SRC_FILES := myjni.c
  19. include $(BUILD_SHARED_LIBRARY)

        myjni.c文件:


  1. #include <string.h>
  2. #include <jni.h>
  3. jstring
  4. Java_com_hello_NdkTest_NdkTest_stringFromJNI( JNIEnv* env,jobject thiz ){
  5. return (*env)->NewStringUTF(env, "Hello from My-JNI !");
  6. }

       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文件:

  1. import android.app.Activity;

  2. import android.os.Bundle;

  3. import android.widget.TextView;

  4. publicclass NdkTest extends Activity {

  5. /** Called when the activity is first created. */

  6. @Override

  7. publicvoid onCreate(Bundle savedInstanceState) {

  8. super.onCreate(savedInstanceState);

  9. TextView tv =new TextView(this);

  10. tv.setText( stringFromJNI() );

  11. setContentView(tv);

  12. }

  13. publicnative String stringFromJNI();

  14. static {

  15. System.loadLibrary("myjni");

  16. }

  17. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值