java windows so文件_windows下编译使用NDK,调用SO文件 | 学步园

下载后把压缩包解压出来,例如:D:\ndk,目录下的ndk-build.cmd就是用来编译的批处理命令。

这里以D:\ndk\samples\hello-jni为例,打开D:\ndk\samples\hello-jni\jni\hello-jni.c查看代码:

/** 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.

**/

#include

#include

/*This is a trivial JNI example where we use a native method

* to return a new VM String. See the corresponding Java source

* file located at:

*

* apps/samples/hello-jni/project/src/com/example/hellojni/HelloJni.java*/

jstring

Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,

jobject thiz )

{

return (*env)->NewStringUTF(env, "Hello from JNI !");

}

因为我们是拿这个c源码文件来使用,如果迁就Java_com_example_hellojni_HelloJni_stringFromJNI

函数名的话,在我们的android工程中java类的声明就要是:com/example/hellojni/HelloJni.java。

反之,如果我们的android工程已经创建好,并且包名是com.example.hellojni,stringFromJNI函数我们写在了MainActivity.java类里,

那么这里的c函数就要修改为:Java_com_example_hellojni_MainActivity_stringFromJNI,否则在寻找函数时会找不到。

然后执行命令:D:\ndk\ndk-build.cmd(如果设置过环境变量则直接使用ndk-build.cmd)来编译hello-jni,如果没有错误会输出:

Gdbserver      : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver

Gdbsetup       : libs/armeabi/gdb.setup"Compile thumb : hello-jni <= hello-jni.cSharedLibrary  : libhello-jni.soInstall        : libhello-jni.so => libs/armeabi/libhello-jni.so

a9662b1765fe84045534fd1a7cdc7fd7.png

编译成功会在D:\ndk\samples\hello-jni\libs\armeabi目录下生成libhello-jni.so文件。

三、创建android应用程序并使用so文件

打开eclipse创建一个android应用程序HelloJni,默认的com.example.hellojni包下面有一个MainActivity.java,

在此包下添加一个HelloJni.java,

package com.example.hellojni;

public class HelloJni {

public native String stringFromJNI();

/*This is another native method declaration that is *not*

* implemented by 'hello-jni'. This is simply to show that

* you can declare as many native methods in your Java code

* as you want, their implementation is searched in the

* currently loaded native libraries only the first time

* you call them.

*

* Trying to call this function will result in a

* java.lang.UnsatisfiedLinkError exception !*/

}

MainActivity.java修改为:

package com.example.hellojni;

import android.os.Bundle;

import android.app.Activity;

import android.view.Menu;

import android.widget.TextView;

import android.util.Log;

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

//setContentView(R.layout.activity_main);

HelloJni jni = new HelloJni();

TextView tv = new TextView(this);

String str = jni.stringFromJNI();

Log.d("HelloJni", str);

tv.setText(str);

setContentView(tv);

}

@Override

public 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;

}

static {

System.loadLibrary("hello-jni");

}

}

把编译生成的libhello-jni.so文件复制到F:\eclipse_workspace\HelloJni\libs\armeabi目录下(armeabi如果不存在则手动创建之),然后编译运行,效果图如下:

d6b5820cb114fbed8bebed6dedf6df78.png

参考资料:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422152.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Discuz! 防御CC攻击的设置办法

防御 CC 攻击 Discuz!5.5 在以往抗 CC 的基础上又加了两种方法&#xff0c;可以根据实际遭受攻击的情况&#xff0c;通过配置组合出适合的抵抗方法。限于篇幅&#xff0c;不详细阐述对抗原理&#xff0c;现将配置方法做下简要说明。配置文件 config.inc.php $attackevasive 0…

php 注销session_php浏览器关闭页面怎么注销session

php浏览器关闭session的方法&#xff1a;首先使用“session_start();”开启session&#xff1b;然后清空session信息&#xff1b;接着清除客户端sessionid&#xff1b;最后通过“session_destroy();”彻底销毁session即可。1、每个页面都必须开启session_start()后才能在每个页…

static的作用

static的作用 在C语言中&#xff0c;static的字面意思很容易把我们导入歧途&#xff0c;其实它的作用有三条。 &#xff08;1&#xff09;先来介绍它的第一条也是最重要的一条&#xff1a;隐藏。 当我们同时编译多个文件时&#xff0c;所有未加static前缀的全局变量和函数都具有…

一道算法题跟大家分享

无意中看到一道算法题&#xff0c;拿出我的解法与大家分享。 题目&#xff1a;输出1,2,3,4四个数字能组成的互不相同且无重复的三位数并统计满足条件的三位数个数 大家先想想&#xff0c;再看答案吧。 View Code 1 /// <summary>2 /// 计算1,2,3,4产生的组成互…

docker php示例,Docker PHP 例子

docker可以执行任何应用程序。本章我们将创建一个Php应用&#xff0c;并使用docker运行它。1. 创建项目目录我们会把这个项目的相关文件&#xff0c;集中放到一个目录docker-php&#xff1a;[rootqikegu demo]# mkdir docker-php2. 创建PHP文件在docker-php目录下&#xff0c;创…

php gzip 关闭,Thinkphp 关闭Gzip header输出问题

Thinkphp默认开启gzip压缩OUTPUT_ENCODE > true, // 页面压缩输出需求是这样的在一个Action里面&#xff0c;用header输出一个图片问题由于thinkphp使用了Ob_start// 页面压缩输出支持 if(C(OUTPUT_ENCODE)){ $zlib ini_get(zlib.output_compression); if(empty($zlib)) ob…

NSTimer 与 Run loop Modes

一.NSRunLoop 在Cocoa中&#xff0c;每个线程(NSThread)对象中内部都有一个run loop&#xff08;NSRunLoop&#xff09;对象用来循环处理输入事件&#xff0c;处理的事件包括两类&#xff0c;一是来自Input sources的异步事件&#xff0c;一是来自Timer sources的同步事件;run …

游戏软件提示d3dcompiler_43.dll的五个解决方法,亲测靠谱

在使用电脑进行工作&#xff0c;玩游戏的时候&#xff0c;我们常常会遇到一些错误提示&#xff0c;其中之一就是“D3DCompiler_43.dll丢失”的提示。D3DCompiler_43.dll是一个非常重要的动态链接库文件。它是由DirectX SDK提供的&#xff0c;用于编译和优化DirectX着色器代码的…

php需要掌握什么,php专业需要掌握哪些知识

网站我们分为前端、后端&#xff0c;组成在一起就可以搭建一套独立的网站。在招聘职位中&#xff0c;前端和后端是分开来招聘的&#xff0c;有前端设计师&#xff0c;PHP后端工程师。如果你能独立完成一个网站&#xff0c;那就是全栈工程师了。好了&#xff0c;让我们来看看搭建…

JDK1.6官方下载_JDK6官方下载地址:http://www.java.net/download

JDK1.6官方下载_JDK6官方下载地址:http://www.java.net/downloadJDK1.6官方下载_JDK6官方下载地址:http://www.java.net/download - Lau Ben - ITeye技术网站 JDK1.6官方下载_JDK6官方下载地址:http://www.java.net/download 博客分类&#xff1a; java.netJavaJDKWindowsHTMLJ…

owncloud nginx php,nginx配置owncloud记录。

开始配置时忘看php-fpm配置结果这里 server unix:/dev/shm/php-cgi.sock; 一直502&#xff0c;后面加上了错误日志输出&#xff0c;才发现问题。upstream php-handler {server unix:/dev/shm/php-cgi.sock; ##开始没注意这里&#xff0c;一直502# Depending on your used PHP v…

前端学习(582):实现观看和调试dom节点

1双击编辑修改 2修改dom 右击edit as html 3复制粘贴

php解析html数组,HTML中如何处理PHP传递的三维数组

需求描述&#xff1a;从 PHP 拿过来一组三维数组&#xff0c;现在想要通过 JQ/JS 获取里面数据。如何在页面中正确获取 {$layer} 的数组(不需要显示)&#xff1f;JQ/JS 分别获取数据&#xff1f;HTMLprint_r($layer);打印结果Array([id] > 2387[image] > /Public/upload/…

无法打开用户默认数据库,登录失败,用户‘sa’登录失败,错误:4064的解决方法...

无法打开用户默认数据库&#xff0c;登录失败&#xff0c;这是因为登录帐户的默认数据库被删除。解决方案&#xff1a;用windows身份模式进入&#xff0c;选择“安全性”---"登录名"------“HRKJ”&#xff0c;在HRKJ上右击&#xff0c;弹出如图窗口&#xff0c;找到…