NDK 编程写法1

参考资料:

Android平台上的JNI技术介绍
http://blog.csdn.net/thinkinwm/article/details/18700807



E:\android-ndk-r9\samples\hello-jni

HelloJni的Java代码如下:

package com.example.hellojni;

import android.app.Activity;
import android.widget.TextView;
import android.os.Bundle;

public class HelloJni extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        TextView tv = new TextView(this);
        tv.setText(stringFromJNI()); //调用native函数
        setContentView(tv);
    }

    /*
     * 声明含有native关键词的函数,就可以在类中使用了。
     */
    public native String stringFromJNI();

    /*
     * 该函数并没有在共享库中实现,但是仍然可以声明。
     * 没有实现的native函数也可以在类中声明,native方法仅在首次调用时才开始搜索。
     * 若没有找到该方法,会抛出java.lang.UnsatisfiedLinkError异常
     */
    public native String unimplementedStringFromJNI();

    /* 使用静态方式再创建类时就载入共享库,该共享库(后面会介绍)在程序安装后
     * 位于/data/data/com.example.HelloJni/lib/libhello-jni.so
     */
    static {
        //这个类被加载的时候,加载 了这个 .so的库
        System.loadLibrary("hello-jni");
    }
}

Java代码中调用native函数很简单。大致分为以下几步

  • 调用 System.loadLibrary 方法载入共享库
  • 声明native方法
  • 调用native方法


hello-jni.c

#include <string.h>
#include <jni.h>  //由google 提供的标准头文件,包含了 与Java 交互的结构

/**
 * (Java_) + (包名把点换成了下划线)+(带上类文件名)+(Java中调用的方法名)
 */
jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                                  jobject thiz )
{
    /**
     * JNIEnv* env 是指针型变量,指向的是和当前线程关联的,通过这个可以访问到和这个线程有关的所有东西
     *
     *
     */

    /**
     * C语言的字符串 是ASCII码
     * Java 现在流行的是 UTF编码
     */
    return (*env)->NewStringUTF(env, "Hello from JNI XZQ!"); //C语言的写法
    //return (*env)->NewStringUTF("Hello from JNI XZQ!"); //C++语言的写法,不用带 env,
}

写完后,cmd 切换到工程目录下, ndk-build编译下,之后可以安装

时间: 2025-01-02 18:41:14

NDK 编程写法1的相关文章

超全Android JNI&NDK编程总结

由于网上关于JNI/NDK相关的知识点介绍的比较零散而且不具备参照性,所以写了这篇JNI/NDK学习笔记,便于作为随时查阅的工具类型的文章,本文主要的介绍了在平时项目中常用的命令.JNI数据类型.签名等,便于查阅相关资料.文末相关参考资料比较适合刚接触或者不熟悉Android NDK开发的朋友参阅. 常用命令 javac 编译java源文件生成.class文件 由于JNI对应的头文件由javah工具根据对应的.class文件生成,所以在进行JNI编程之前,写好Java代码后需要先编译,在使用ja

Android Studio Ndk 编程

现在开发Android程序基本都已经从Eclipse转到了Android Studio了, 最近项目需求, 需要用到ndk编程, 于是就折腾了一下. 开发环境 Android Studio 1.5.1 android-ndk-r10e gradle 2.8 首先我们新建一个工程叫做NdkDemo, 创建后的工程目录结构如下 然后我们打开gradle.properties文件, 在文件的尾端写一句, 如果没有写这一句会编译不通过 android.useDeprecatedNdk=true 接着配置

两分钟学会Android平台NDK编程(无须Eclipse和cygwin,可使用命令行打包多个so)

之前在进行cocos2dx开发时,已经详细介绍了如何将win32的c++代码移植到Android平台,当再次回顾时,发现一些基础的东西理解并不是很彻底,今天使用Android NDK提供的一个例子做一个简单的移植.在进行该demo前,请确认你已经配置了Android开发环境和安装了最新的Android NDK. 1.创建Android项目 创建一个Android项目 , 包名是com.example.hellojni,创建一个Activity作为程序进入的Acitivity,命名为HelloJn

Android平台NDK编程

转自:http://blog.csdn.net/wangbin_jxust/article/details/37389383 之前在进行cocos2dx开发时,已经详细介绍了如何将win32的c++代码移植到Android平台,当再次回顾时,发现一些基础的东西理解并不是很彻底,今天使用Android NDK提供的一个例子做一个简单的移植.在进行该demo前,请确认你已经配置了Android开发环境和安装了最新的Android NDK. 1.创建Android项目 创建一个Android项目 ,

windows安卓NDK编程

去年搞过一次NDK,当时觉得挺麻烦,以后就一直没再搞过,现在公司的项目需要使用NDK编程,今天又搞了一边,遇到了些问题,和大家分享一下 . 一. 安装Cygwin 1.下载Cygwin http://cygwin.com/setup-x86.exe   双击运行出现如下界面,点击下一步 选择install from internet ,点击下一步 选择默认位置 c:\cygwin ,点击下一步 依旧默认位置,继续点击下一步 默认选项Direct Connection 就可以,继续点击下一步 可以

NDK编程心得

初学NDK编程,编程中碰到了不少的问题,有点心得,现总结一下: 1. 注意java类在NDK里的表现形式,也就是smali格式.比如Ljava/lang/String; String是大写,后面的分号也不能少.类型一定要匹配,比如调用getClassLoader时,函数的类型是 ()Ljava/lang/ClassLoader; 而不能写成()Ljava/lang/Object; 如果写错,则错误很难马上查到. 2. NDK里对java函数的调用非常严格,静态方法必须使用静态调用接口,返回值为空

NDK编程中遇到的问题之一 --- “/android-ndk/build/gmsl/__gmsl:512: *** non-numeric second argument to `wordlist&#39; function”

参考:http://www.cnblogs.com/frydsh/archive/2013/05/11/3073349.html 从网上下载了一个包含jni代码的Android工程,编译它的时候出现以下错误: .../android-ndk/ndk-build Invalid attribute name:       package       .../android-ndk/build/gmsl/__gmsl:512: *** non-numeric second argument to `

Javascript模块化编程-写法

JS模块化编程,已经成为一个迫切的需求.理想情况下,开发者只需要实现核心业务逻辑,其他都可以加载别人已经写好的模块. 但是,JS不是一种模块化编程语言,它不支持类,所以没有严格意义上的模块.为了实现模块化,类模块化应运而生. 1.原始写法: 模块就是实现特定功能的一组方法. 只需要把不同的函数简单的放在一起,就是一个模块. Eg: function t1(){ //... } function t2(){ //... } 缺点:污染全局变量,无法保证不与其他模块发生变量名冲突,而且模块成员之间看

Android?Studio?NDK编程-环境搭建及Hello!

一,下载 安装android-ndk开发包 NDK各个版本链接二,新建项目NDKDemo,选择空Activity就可以:(注:Android studio 2.2,可通过SDK Tools 添加LLDB,CMake,更方便的开发jni程序了) 三,按F12,配置项目NDK路径: 四,在MainActivity中添加如下代码: static {    System.loadLibrary("MyJni");//导入生成的链接库文件}public native String getStri