eclipse配置生成.h和.so文件过程

来源:互联网 发布:封面制作软件ios 编辑:程序博客网 时间:2024/06/05 01:01

在eclipse中生成.h文件需要安装JDK

生成.so文件需要安装:cygwinandroid-ndk

因为这两个文件太大。我就不上传,自行百度。先安装以上环境在进行以下操作。

1、创建android工程

        在这里我选择的是android API 5.0

         

         选好后一直接Next直到android工程创建好。

2.右键工程 ----new -----Folder(创建JNI文件夹)

        因为手动创建的jni文件夹下面没有任何东西。这时候我们需要手动创建Android.mk文件。

          

         

  Android.mk里面的配置:
         
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE    := YHJniLOCAL_SRC_FILES := YHJni.cinclude $(BUILD_SHARED_LIBRARY)public class HelloNative { public native String hello(); public native int algorithm(int a ,int b);}
         LOCAL_MODULE    :=生成的so文件名
         LOCAL_SRC_FILES : .c或.cpp文件名(如需导入多个可以使用       LOCAL_SRC_FILES := xx.c\xx.c\xx.c)
3、创建java:
     
public class HelloNative { public native String hello(); public native int algorithm(int a ,int b);}
4、在eclipse配置生成.h或.so文件
   4.1 配置生成.h
      下图点击最上方红框下拉按钮。
        选择:external tools ..跳到下图界面
        如果第一次配置:双击Program;需要改名在Name框输入自定义名字

     

    1:Location

       里面是输入jdk下的javah.exe路径。我输入的是绝对路劲;点击2选择javah.exe路径。

    2:Working Directory

        点击4选择刚刚创建android工程的bin

   3:Arguments

      -classpath .;./classes -d "${workspace_loc:/Hello}/jni" -jni ${java_type_name}

       红色部分是引用Working Directory里面的值;把bin去掉

   4.2 配置生成.so

          

1:Location

     里面是输入ndk下的ndk_build.cmd路径。我输入的是相对路径(绝对路径也可以);

       点击Browse file System选择ndk下的ndk_build.cmd路径。

2: Working Directory

     选择刚刚我们在工程下面创建的jni文件(jni文件主要放.c、.h、Android.mk文件)。


---------现在已经配置好.h和.so。接下来我们生成.h,刚刚我们创建的java文件就是生成.h头文件用的。


在点击JavaH生成.h头文件;在点击JavaH时一定要选择生成.h头文件的java文件,不然会报错。点击后我们会发下jni文件夹下面就生成了一个.h文件。


5、生成.h文件的类容:

/* DO NOT EDIT THIS FILE - it is machine generated */#include /* Header for class com_example_hellojni_HelloNative */#ifndef _Included_com_example_hellojni_HelloNative#define _Included_com_example_hellojni_HelloNative#ifdef __cplusplusextern "C" {#endif/* * Class:     com_example_hellojni_HelloNative * Method:    hello * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_example_hellojni_HelloNative_hello  (JNIEnv *, jobject);/* * Class:     com_example_hellojni_HelloNative * Method:    algorithm * Signature: (II)I */JNIEXPORT jint JNICALL Java_com_example_hellojni_HelloNative_algorithm  (JNIEnv *, jobject, jint, jint);#ifdef __cplusplus}#endif#endif
6、创建.c文件

      在.c文件中引用.h头文件,在把.h中的接口实例化,在其中进编码。

#include "com_example_hellojni_HelloNative.h"JNIEXPORT jstring JNICALL Java_com_example_hellojni_HelloNative_hello  (JNIEnv *env, jobject obj){return "hello worid";}JNIEXPORT jint JNICALL Java_com_example_hellojni_HelloNative_algorithm  (JNIEnv *env, jobject obj, jint a , jint b){return a+b;}

6、生成.so文件

   点击NDK_Buider(该名字是自己定义,点击自己定义就好)出现控制台内的内容就成功生成.so文件。刷新工程,在libs/armeabi下面就会有.so文件。



7、android调用.so

     android调用.so直接贴代码就不一一讲解:

package com.example.hellojni;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;public class MainActivity extends Activity implements OnClickListener{static{System.loadLibrary("HelloJni");}private Button button,button1;private TextView textView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button =(Button)findViewById(R.id.button);button.setOnClickListener(this);button1 =(Button)findViewById(R.id.button1);button1.setOnClickListener(this);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();if (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch (v.getId()) {case R.id.button:String str = new HelloNative().hello();textView =(TextView)findViewById(R.id.text_view);textView.setText("返回的字符串:"+str);break;case R.id.button1:int number = new HelloNative().algorithm(8, 8);textView =(TextView)findViewById(R.id.text_view);textView.setText("返回的字符串:"+number);    break;default:break;}}}

因为工作需要第一次接触android;第一次写android调c,c调android,所有写一个小例子,好让以后用到可以后头看看。

接下来可能总结一下纯.c调android。



原创粉丝点击