簡體   English   中英

如何從JNI調用C ++方法

[英]How to call c++ methods from JNI

在Java代碼中:

System.loadLibrary("twolib-second");

int  z = add(1, 2);

public native int add(int  x, int  y);

first.cpp:

#include "first.h"

int  first(int  x, int  y) {
    return x + y; }

first.h:

#ifndef FIRST_H
#define FIRST_H

extern int first(int  x, int  y);

#endif /* FIRST_H */

second.c:

#include "first.h"
#include <jni.h>

jint
Java_com_example_jniexample_MainActivity_add( JNIEnv*  env,
                                      jobject  this,
                                      jint     x,
                                      jint     y )
{
    return first(x, y);
}

Android.mk:

LOCAL_PATH:= $(call my-dir)

# first lib, which will be built statically
#
include $(CLEAR_VARS)

LOCAL_MODULE    := libtwolib-first
LOCAL_SRC_FILES := first.cpp

include $(BUILD_STATIC_LIBRARY)

# second lib, which will depend on and include the first one
#
include $(CLEAR_VARS)

LOCAL_MODULE    := libtwolib-second
LOCAL_SRC_FILES := second.c

LOCAL_STATIC_LIBRARIES := libtwolib-first

include $(BUILD_SHARED_LIBRARY)

我不斷收到此錯誤:

/home/username/ndk/android-ndk-r9/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../。 ./../../arm-linux-androideabi/bin/ld:./obj/local/armeabi/objs/twolib-second/second.o:在函數Java_com_example_jniexample_MainActivity_add:jni / second.c:26中:

錯誤:對“ first” collect2的未定義引用:ld返回1退出狀態make: * [obj / local / armeabi / libtwolib-second.so]錯誤1

您需要使用extern“ C”包圍first.h中的聲明,以便從second.c首先調用func。

我猜這是因為您的第一個文件被編譯為cpp,而第二個文件被編譯為c。 區別在於名稱改寫。 您可以調用linux bin util命令nm到靜態庫和目標文件中,以列出符號並查看搶劫情況。 我想您會首先在靜態庫中看到一個功能混亂的符號; 第二個中的func完整符號

使用ndk編程時,您會看到許多未定義的引用。 linux bin utils將是使生活更輕松的好工具。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM