jni dev

转载 2015年07月07日 17:24:31
这几天一直在研究JNI的开发过程,顺便把NDK环境搭建一起总结下。在windows环境下开发jni需要c/c++编译器的支持,网络上我看很多人使用cygwin。呵呵我不是很喜欢使用它,感觉安装起来挺麻烦的。我使用GNUStep,下载地址http://www.gnustep.org/experience/Windows.html


下载安装后,验证是否成功。打开GNUstep->Shell,输入make -v 和 gcc -v命令,如图所示。




下载NDK,地址http://developer.android.com/tools/sdk/ndk/index.html。下载完后解压即可。
配置ndk环境变量,gnustep是模拟linux的环境的,打开gnustep的安装目录下的G:\softinstall\GNUstep\GNUstep\GNUstep.conf文件,添加以下内容:
复制内容到剪贴板
代码:
NDK=/g/softinstall/Android/android-ndk-r8b
export=NDK

说明如果不知道ndk目录在linux下应该是在哪里,你可以打开gnustep的命令窗口,输入mount,就可以找到对应的盘符。
验证环境变量,如下图。 


以上就配置成功了。

下载进入正题啦。Jni的开发步骤。
打开eclipse,新建工程名为testJni。在activity中添加以下代码
复制内容到剪贴板
代码:
package com.xzw.jni;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import android.support.v4.app.NavUtils;
/**

@author XuZhiwei (xuzhiwei@gmail.com)
* sina:http://weibo.com/xzw1989

* Create at 2012-8-30 上午10:49:45
*/
public class TestJni extends Activity { 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); 
    }
   //natvie必须声明,用于生成C/C++代码
    public native String hello();
   
    static{
            System.loadLibrary("testJni");
    }
    
}
编译后的文件在bin目录下,通过javah命令生成c/c++的文件头。如下图  


会在项目目录下生成jni/com_xzw_jni_TestJni.h。
头文件代码如下:
复制内容到剪贴板
代码:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_xzw_jni_TestJni */

#ifndef _Included_com_xzw_jni_TestJni
#define _Included_com_xzw_jni_TestJni
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     com_xzw_jni_TestJni
* Method:    hello
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_xzw_jni_TestJni_hello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
这里我们可以根据头文件编写c代码
复制内容到剪贴板
代码:
#include <string.h>
#include <jni.h>


jstring
Java_com_xzw_jni_TestJni_hello
  (JNIEnv* env, jobject thiz){
          return (*env)->NewStringUTF(env, "哈哈完成自动化编译 !");
}
接下来编写 Android.mk,该文件可以直接从NDK的samples下的hello-jni的jni文件下直接靠过来改改就可以了。也贴下代码哈。
复制内容到剪贴板
代码:
# 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    := testJni
LOCAL_SRC_FILES := testJni.c

include $(BUILD_SHARED_LIBRARY)
其中你只需要该LOCAL_MODULE和LOCAL_SRC_FILES就可以了。
说明:LOCAL_MODULE是描述模块的,用来给java调用的模块名,会生成对应的libtestJni.so
LOCAL_SRC_FILES就是源文件啦,多个文件空格隔开即可。
接下来,我们要开始编译生成so文件咯。
打开gnustep的命令窗口,进入到项目底下,输入$NDK/ndk-build命令,即可自动生成libs/armeabi/libtestJni.so文件。



接下来就是java调用了。直接上代码
复制内容到剪贴板
代码:
package com.xzw.jni;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import android.support.v4.app.NavUtils;
/**

@author XuZhiwei (xuzhiwei@gmail.com)
* sina:http://weibo.com/xzw1989

* Create at 2012-8-30 上午10:49:45
*/
public class TestJni extends Activity { 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView tv = new TextView(this);
        tv.setText(hello()); //这里的hello() 就是调用c
        setContentView(tv);
    }

    public native String hello();
   
    static{
            System.loadLibrary("testJni");
    }
    
}
运行结果如下


以上就是jni的开发步骤了。
在这里我还要补充下:
在我们开发过程中,改一个c/c++的文件,我们都要手动去编译一下有点儿麻烦。这里我们可以使用让eclipse帮助我们自己编译。

右击jni工程的properties-->Builders-->NEW -->;Program 可以看到以下内容:
 


argument:--login -c "cd /e/myWorkSpace/android/hellJni && $NDK/ndk-build"
切换到Refresh 标签页
 

切换到Build Options标签页
 


这样就完成了配置,点击确定可看到控制台自动编译程序了
 


能力有限,请大家多多指教。附上源码  hellJni.rar (682.35 KB) 。欢迎关注我的博客:
http://home.51cto.com/index.php?s=/space/978424

问题总结2013W07 —— Android 编译OpenCV Demo遇到的问题

1. OpenCV下载与编译     Ref         Using OpenCV with Eclipse (plugin CDT)     Step         软件安装   ...
  • yanx730
  • yanx730
  • 2013年02月20日 10:54
  • 10963

Android For JNI(一)——JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序,使用C启动JAVA程序

Android For JNI(一)——JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序 当你的Android之旅一步步的深入的时候,你其实会发现,很多东西都必须去和fram...
  • qq_26787115
  • qq_26787115
  • 2016年04月13日 22:26
  • 4805

通用GPIO驱动和apk(含jni),支持所有GPIO,支持LED控制,支持友善6410/210开发板,支持安卓2.3/4.0,内核2.6/3.0

转自:http://www.arm9home.net/read.php?tid-27259.htmlGPIO Driver and apk(include jni) support All GPIO ...
  • blogercn
  • blogercn
  • 2014年12月12日 12:35
  • 2050

【原创】windows下学习JNI?eclipse + dev-c++就够了,方便

注:本文是入门教程,关于环境搭建。常用的Eclipse+CDT或者minGW方法本人试过好多次,都没有成功。因此其他方法可行的同志们,可以当做一种参考,或者有比这个更方便的方法的同学们欢迎提出更好地解...
  • zachgenius
  • zachgenius
  • 2012年03月03日 22:26
  • 528

JAVA 本地调用(JNI)之用dev c++简单实现

笔者在最近的项目中需要用JNI,调用C/C++编好的程序,由于此前对JNI不熟悉,在网上找了好多都是基于VC或者VS2008系列实现的,这样为了实现一个简单的调用,需要装几百兆的VC或者几个G的VS很...
  • JAVA2010CZP
  • JAVA2010CZP
  • 2012年04月14日 11:54
  • 2128

Windows7下使用Dev-CPP 编译 JNI

新建Java工程 编写调用JNI的Java代码,在Windows下是调用 dll,但不用写在代码里 利用Javah工具对class生成对应的...
  • Vange
  • Vange
  • 2012年08月20日 17:49
  • 1043

Android JNI编程(一)——JNI概念以及C语言Dev-C++开发环境搭建、编写HelloWorld

一:JNI是什么? JNI:JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++) ,简单来说就是Java调C,C调J...
  • a_zhon
  • a_zhon
  • 2016年11月21日 11:04
  • 853

Android For JNI(一)——JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序,使用C启动JAVA程序

本文通过博主同意转载,原文地址:http://blog.csdn.net/qq_26787115/article/details/51146651#quote Android For JNI(一)—...
  • qq_30371303
  • qq_30371303
  • 2016年04月25日 16:46
  • 775

使用Dev C++编译运行一个C语言程序

使用Dev C++编译运行一个C语言程序
  • WeiMengXuan
  • WeiMengXuan
  • 2017年11月16日 19:12
  • 320

dev c++如何安装ege

往dev c++安装ege的问题;
  • iwiYES
  • iwiYES
  • 2017年06月10日 09:47
  • 947
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:jni dev
举报原因:
原因补充:

(最多只允许输入30个字)