首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从JNI在Android上调用非静态方法

从JNI在Android上调用非静态方法的步骤如下:

  1. 在Java代码中定义一个本地方法,该方法将调用C++代码。
代码语言:java
复制
public class MainActivity extends AppCompatActivity {
    // 声明本地方法
    public native String callCppMethod(String name);

    // 加载库文件
    static {
        System.loadLibrary("native-lib");
    }

    // ...
}
  1. 使用JNI C++头文件,并实现本地方法。
代码语言:cpp
复制
#include <jni.h>
#include "MainActivity.h"

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_myapplication_MainActivity_callCppMethod(JNIEnv *env, jobject obj, jstring name) {
    // 获取Java字符串
    const char *name_str = env->GetStringUTFChars(name, NULL);

    // 调用C++方法
    std::string result = callCppMethod(name_str);

    // 释放Java字符串
    env->ReleaseStringUTFChars(name, name_str);

    // 返回结果
    return env->NewStringUTF(result.c_str());
}
  1. 在C++代码中实现非静态方法。
代码语言:cpp
复制
#include<iostream>
#include<string>

std::string callCppMethod(const std::string &name) {
    std::string result = "Hello, ";
    result += name;
    return result;
}
  1. 编译C++代码,生成动态库文件。
代码语言:sh
复制
$ g++ -shared -fPIC -o libnative-lib.so MainActivity.cpp
  1. 将动态库文件放入Android项目的src/main/jniLibs目录下。
  2. 在Android项目中调用本地方法。
代码语言:java
复制
// 调用本地方法
String result = callCppMethod("JNI");

以上就是从JNI在Android上调用非静态方法的步骤。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

JNI--静态native方法使用及cc++调用Java变量

上次说到了JNI调用的具体步骤,先再JAVA类中定义了静态native方法,使用javah命令生成c/c++的head文件,再实现相应的c或者c++函数,今天来看下java静态native方法JNI...image.png 对比上面的静态native方法发现:区别只有第二个参数,静态方法是jclass,静态是jobject 下面开始编写c++代码 #include "my_jni.h" #include...理解:我们java中可以直接使用类名.静态方法的方式在外部调用静态方法,但是非静态方法的外部调用必须使用一个实例化的对象。...反过来看native方法静态静态的区别其实是一样的 接下来,学习使用c/c++获取java的变量,并改变它的值 JniDemo类中定义一个静态变量 public String javaStr...静态变量和静态变量的调用区别不大,有相应的static方法,设置java变量的具体步骤为:获取fieldId->调用GetXXXField方法获取java对象->如果是基本对象,直接使用,引用对象(jobect

1.7K10
  • Java中静态方法不能调用静态方法的原因

    如图,是Java中静态代码和实例对象互相调用的规则,我们接下来就讲讲为什么Java中静态方法不可以调用静态代码呢。...静态方法是属于类的,即静态方法是随着类的加载而加载的,加载类时,程序就会为静态方法分配内存,而非静态方法是属于对象的,对象是类加载之后创建的,也就是说静态方法先于对象存在,当你创建一个对象时,程序为其堆中分配内存...静态方法不依赖于对象的调用,它是通过‘类名.静态方法名’这样的方式来调用的。而对于静态方法,在对象创建的时候程序才会为其分配内存,然后通过类的对象去访问静态方法。...因此在对象未存在时静态方法也不存在,静态方法自然不能调用一个不存在的方法。...(3)不能用一个值为null的引用类型变量来调用静态方法,这样会抛出空指针异常,但是静态方法可以被一个值为null的引用类型变量调用而不会抛出空指针异常。

    5.6K50

    Android JNI 调用时缓存字段和方法 ID

    JNI调用 Java 的方法和访问字段时,最先要做的操作就是获得对应的类以及对应的方法 id。...事实,通过 FindClass 、GetFieldID、GetMethodID 去找到对应的信息是很耗时的,如果方法被频繁调用,那么肯定不能每次都去查找对应的信息,有必要将它们缓存起来,在下一次调用时...当类被加载进内存时,会先调用类的静态代码块,所以可以类的静态代码块中进行缓存。...} private static native void initCacheMethodId(); } 静态代码块中,可以将所需要的字段 id 或者方法 id 缓存成全局变量。...JNI 中直接将方法 id 缓存成全局变量了,这样再调用时,就不要再进行一次查找了,并且避免了多个线程同时调用会多次查找的情况。

    1.1K20

    Android 通过 JNI 访问 Java 字段和方法调用

    在前面的两篇文章中,介绍了 Android 通过 JNI 进行基础类型、字符串和数组的相关操作,并描述了 Java 和 Native 类型和签名之间的转换关系。...,JNI 调用对应的方法不同。...对于类的静态字段,JNI方法多了 Static 的标志来表明这个对应于类的静态字段访问。...方法调用 JNI 调用 Java 方法JNI 访问 Java 字段的步骤也大致相同, 获取 Java 对象的类 获取对应方法的 id 调用具体的方法调用类的实例方法静态方法为例: 调用类的实例方法...小结 可以看到, JNI 中访问 Java 的字段和访问,两者的步骤都是大致相似的,只是调用JNI 方法有所区别。 具体示例代码可参考我的 Github 项目,欢迎 Star。

    1.1K10

    Android通过jni调用本地cc++接口方法总结

    也就是 Java 中调用 C/C++ 代码,或者 C/C++ 中调用 Java 代码,下面一一详细介绍。...调用其他三方动态库的使用过程,可以参见博主的另一篇文章介绍: 支付宝二维码脱机认证库android的app下测试过程记录_特立独行的猫a的博客-CSDN博客 java调用JNI总结_特立独行的猫a的博客...如果接口不带参数,所以签名是()I,如果我的接口方法带两个参数,这里签名应该是 (II)I, I表示的是int类型,否则java层通过JNI调用时,会报找不到方法。...JNI_Onload函数,当启动程序的时候会加载动态库文件,就会调用这个函数。接着onload函数中,注册了nativemethods。...NDK 入门到精通(汇总篇)_阿飞__的博客-CSDN博客 JNI基础:JNI数据类型和类型描述符_阿飞__的博客-CSDN博客 java调用JNI总结_特立独行的猫a的博客-CSDN博客 支付宝二维码脱机认证库

    2.1K40

    【面试题精讲】Java静态方法为什么不能调用静态成员?

    什么是静态方法静态成员? Java 中,静态方法(static method)是属于类的方法,而不是属于对象的方法。它可以通过类名直接调用,无需创建对象实例。...为什么静态方法不能调用静态成员? 静态方法不能调用静态成员的原因是:静态方法没有对象实例的情况下就可以被调用,而非静态成员必须依赖于对象实例才能访问。...如果允许静态方法调用静态成员,那么静态方法中无法确定要访问哪个对象的成员,这将导致逻辑的混乱和错误。 3. 如何解决静态方法无法调用静态成员的问题?...总结 静态方法不能调用静态成员的原因是静态方法没有对象实例的情况下就可以被调用,而非静态成员必须依赖于对象实例才能访问。...为了解决这个问题,可以静态方法内部创建对象实例来访问和调用静态成员,或者将静态成员改为静态成员。但需要注意,设计程序时要合理使用静态方法静态成员,并根据具体需求选择适当的方式。

    56630

    Android 通过 JNI 调用 Java 类的构造方法和父类的方法

    Android 还可以通过 JNI调用 Java 一个类的构造方法,从而创建一个 Java 类。 调用构造方法 调用构造方法的步骤和之前调用类的实例方法步骤类似,也需要获得对应的类和方法 id。...除了 NewObject 方法之外,JNI 还提供了 AllocObject 方法来创建对象,以同样调用 Animal 类构造方法为例: /** * 通过 AllocObject 方法来创建一个类...通过这种方法,同样可以创建一个 Java 中的类。 调用父类的方法 可以通过 JNI调用父类的实例方法。...子类中通过调用 CallNonvirtualMethod 方法调用父类的方法。...由此,通过 JNI调用 Java 算是基本完成了。 具体示例代码可参考我的 Github 项目,欢迎 Star。

    2.7K20

    Android NDK 开发】JNI 线程 ( JNI 线程创建 | 线程执行函数 | JNI 方法获取 JNIEnv 与 Java 对象 | 线程获取 JNIEnv | 全局变量设置 )

    需要先将局部变量转为全局变量 , 然后再其它方法调用 jobject obj; ② JNI 方法处理 : 将 jobject instance 参数 ( 此时是局部变量 ) 转为 全局变量 , 调用...线程方法获取 JNIEnv ---- 线程中获取 JNIEnv * env 步骤 : ① JNIEnv 无法跨线程 : JNI 方法参数中的 JNIEnv 指针是不能跨线程使用的 , 主线程中调用... 主线程中调用 JNI 方法 , 其 JNIEnv 指针不能在子线程中使用 如果在子线程中使用 JNIEnv 指针 , 需要使用 JavaVM 获取 指定线程的 JNIEnv 指针...> //Java 虚拟机指针 , JNI_OnLoad 方法中设置该值 JavaVM *_vm; //JNI 方法参数中的第二个参数 , 需要先将局部变量转为全局变量 , 然后再其它方法调用..., 主线程中调用 JNI 方法 , 其 JNIEnv 指针不能在子线程中使用 如果在子线程中使用 JNIEnv 指针 , 需要使用 JavaVM 获取 指定线程的 JNIEnv 指针

    90620

    Android将camera获取到的YuvDatajni中转化为Mat方法

    Android中可以通过camera获取图像,并实时处理,不同的手机camera支持的的图像格式不同,可以采用getCameraPreviewFormat来得到preview支持的图像编码格式,Android...为了达到实时处理的目的,很多时候我们将得到的yuv数据直接传入jni中的c++使用,减少上层转化图像格式的过程yuv420本身属于单通道图像,若图像处理中只需要获取灰度图像,可以c++中直接通过Mat...构造函数构造生成灰度图像,代码如下: /* * ImageProcessing.cpp * 实时显示canny算子结果 */ #include <jni.h #include <opencv2/...imwrite("/mnt/sdcard/readYuv.jpg",mBgr); env- ReleaseByteArrayElements(yuv, pBuf, 0); return 0; } 以上这篇Android...将camera获取到的YuvDatajni中转化为Mat方法就是小编分享给大家的全部内容了,希望能给大家一个参考。

    1K30

    Android NDK编程(五)--- CC++调用Java不同类中的静态方法

    前言 一篇我们介绍了《Android NDK编程(四)--- C/C++调用Java中的方法》,主要是C/C++中调用Java的方法,这一篇我们针对上一篇的内容再延伸说一下,关于调不同类中的静态方法。...通过ALT+ENTERnative-lib.cpp中增加了对应的方法函数,然后写实现方法。 ? 最后再我们的按钮事件里调用VaccaeJNI类中的静态方法 ? 运行结果 ?...上面来说我们java调C/C++的方法其实基本都差不多,下面我们重点要说一下C/C++调用java的方法。 我们VaccaeJNI中加入一个native的静态方法和一个本地的静态方法。 ?...---- 调用不同类中的方法 最后我们要说一下重点,因为我们方法的时候可能会调用的是不同类里面的方法,导航native的方法和要调用的java方法不在同一个类里,遇到这样的方法我们来看一看怎么实现...我们还是VaccaeJNI的类中写一个静态方法,两个数相乘 ? 然后调用的native的函数,我们直接写在Mainactivity.java中 ?

    1.7K20

    Android 使用Canvas图片绘制文字的方法

    AndroidAndroid中 Paint 字体、粗细等属性的一些设置 Android SDK中使用Typeface类来定义字体,可以通过常用字体类型名称进行设置,如设置默认黑体: Paint mp...,所以还有如下设置方式: Paint mp = new Paint(); mp.setFakeBoldText(true); //true为粗体,false为粗体 mp.setTextSkewX(-0.5f...,整数左斜 mp.setUnderlineText(true); //true为下划线,false为非下划线 mp.setStrikeThruText(true); //true为删除线,false为删除线...一个小应用,图片绘制文字,以下是绘制文字的方法,并且能够实现自动换行,字体自动适配屏幕大小 private void drawNewBitmap(ImageView imageView, String...使用Canvas图片绘制文字的方法就是小编分享给大家的全部内容了,希望能给大家一个参考。

    4.4K20

    Android调用系统摄像头拍照并显示ImageView

    简介 现在市面上的apk只要涉及用户中心都会有头像,而且这个头像也是可自定义的,有的会采取读取相册选择其中一张作为需求照片,另一种就是调用系统摄像头拍照并获取即时照片,本博文就是讲述如何调用摄像头拍照并显示指定的控件...<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com.../tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation...android:text="开启相机" android:gravity="center" android:layout_width="match_parent" android:layout_height...Studio使用ButterKnife和Zelezny,点击事件触发后调用系统的action开启摄像头拍照界面,在这里面我们要注意startActivityForResult必须使用这个方法来回调,第一个参数为

    2.3K20
    领券