千家信息网

用ndk制作一个安卓so

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,做个记录打开EclipsFile->New->Project选择安卓应用填写名称mytest2ndk然后一路点下去就行,不用选什么,注意不要勾选 Mark this project as a libr
千家信息网最后更新 2026年11月03日用ndk制作一个安卓so

做个记录
打开Eclips
File->New->Project

选择安卓应用

填写名称mytest2ndk

然后一路点下去就行,不用选什么,注意不要勾选 Mark this project as a library,生成so的事情在其他地方处理。

然后工程就建好了,接下来右键工程选择Android Tools,再选择Add Native Support

给so文件起一个名字。
接下来开始写java的native方法,这里有2种方法

一种是直接在MainActivity里面写,这里不推荐,因为后面会有坑。
所以建议生成一个新的文件,选择NEW一个CLASS

修改NativeClass.java内容

package com.example.my2testndk;public class NativeClass {    static{        System.loadLibrary("mytest2ndk");        }        public native String getTraceIP(String strace_ip);}

然后进入工作目录
在win的cmd命令行里面运行javah -classpath bin/classes -d jni com.example.my2testndk.NativeClass
就可以生成头文件

注意如果写在MainActivity文件里面,这里会报错不过去,只有把bin/classes改成src或者是绝对路径,很麻烦,还是建立一个新文件好了。
然后jni目录下建一个.cpp文件

#include #include "com_example_my2testndk_NativeClass.h"#include #include #include #include #include #include #include #include #include #include #include char buftext[100] = {0};const char* getRawSocket(const char* domainIP){    int recvsockfd = -1;    if ((recvsockfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)/*socket(PF_PACKET,  SOCK_DGRAM, htons(ETH_P_ALL))*/)== -1)  //ipdata recv and send    {        sprintf(buftext,"error! %d %s\n",errno,strerror(errno));        return buftext;    }    sprintf(buftext,"SOCK_RAW ok!\n");    return buftext;}JNIEXPORT jstring JNICALL Java_com_example_my2testndk_NativeClass_getTraceIP    (JNIEnv *env, jobject thiz,jstring domainIP) {    const char* strdomainIP = env->GetStringUTFChars(domainIP, 0);    return env->NewStringUTF(getRawSocket(strdomainIP));    }

然后打开Cygwin-Terminal,进入工作目录
运行$NDK/ndk-build DK_DEBUG=1 -B V=1

有时候会出现 multiple target patterns. Stop.
把obj下面的删除再编译就行
编译成功后,在libs\armeabi下面会出现so。

然后修改MainActivity.java

package com.example.my2testndk;import android.app.Activity;import android.os.Bundle;import android.widget.TextView;public class MainActivity extends Activity {    NativeClass nativeClass;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        TextView tv = new TextView(this);        setContentView(tv);             nativeClass = new NativeClass();        tv.setText(nativeClass.getTraceIP("8.8.8.8"));    }}

这时候我们运行run as/Android application

显示权限错误,因为安卓不允许调用runsocket这种底层的功能。
看代码能够理解,这里是想做一个trace的功能,函数无权限,此路不通。

文件 选择 目录 生成 运行 安卓 接下来 功能 工程 方法 权限 工作 编译 成功 不用 事情 代码 内容 函数 只有 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网络科技 小米移动互联网科技园 广州紫鲸互联网科技有限公司 重生之互联网科技帝国 互联网科技公司发展 合肥互联网科技公司 智网互联网科技 互联网科技公司怎么样 广州宏创互联网科技 云电互联网科技 顺网科技2021年互联网排名 北京华百购互联网科技有限公司 承德科技产业互联网发展 湖北码尼互联网科技有限公司电话 电子科技大学互联网创业大赛 中国科技创新与世界互联网大会 滨湖区互联网智能科技产品有哪些 产业互联网科技服务公司 富国互联网金融科技混合基金 如何强化互联网金融科技 互联网巨头反垄断金融科技 杭州互联网科技公司 左右互联网络科技 阿里巴巴算科技企业还是互联网 常德市电业局互联网科技部 现代互联网科技股 中和天地互联网科技有限公司 宇信科技在杭州互联网排第几 同城互联网络科技 米泉互联网科技专业怎么样
0